翼度科技»论坛 编程开发 python 查看内容

基于回归分析的波士顿房价分析

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
基于回归分析的波士顿房价分析

项目实现步骤:
1.项目结构
2.处理数据
3.处理绘图
4.对数据进行分析
5.结果展示
一.项目结构

二.处理数据
  1. from sklearn import datasets
  2. import pandas as pd
  3. """
  4. sklearn1.2版本后不在保留load_boston数据集,
  5. 可用
  6. """
  7. def get_data():
  8.     # 获取波士顿数据
  9.     # data_url = "http://lib.stat.cmu.edu/datasets/boston"
  10.     # raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
  11.     # print(raw_df)
  12.     # # 输入
  13.     # boston_x = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
  14.     # # 输出
  15.     # boston_y= raw_df.values[1::2, 2]
  16.     # # 自作数据集
  17.     # boston=pd.DataFrame(boston_x)
  18.     # print(boston)
  19.     boston=datasets.load_boston()
  20.     # 输入
  21.     boston_x=boston.data
  22.     # 输出
  23.     boston_y=boston.target
  24.     # 自制数据集
  25.     boston_new=pd.DataFrame(boston_x)
  26.     boston_new.columns=boston["feature_names"]
  27.     boston_new['PRICE']=boston_y
  28.     # 保存数据
  29.     # boston_new.to_csv('./models/Data/boston.csv')
  30.     return boston_new
复制代码
使用sklearn的datasets时,对应的波士顿房价数据已经被“移除”,在获取数据时,会出现

,此时,在该提示的下方会有相关的解决方法

不建议使用提供的方法,对应方法的数据与具体实现项目的数据有误差
三.处理绘图
1.绘图前准备
  1. import numpy as np
  2. def get_request(request,data):
  3.     # 要处理的数据
  4.     # 设置初始值
  5.     control={
  6.         'CRIM':'城镇人均犯罪率',
  7.         'ZN':'占地面接超过5万平方米英尺的住宅用地面积',
  8.         'INDUS':'城镇非零售业务的比例',
  9.         'CHAS':'查尔斯河虚拟变量',
  10.         'NOX':'一氧化碳浓度',
  11.         'RM':'平均每个居民拥有的房数',
  12.         'AGE':'在1940年前建成的所有者占用单位的比例',
  13.         'DIS':'与五个波士顿就业中心的加权距离',
  14.         'TAX':'每10000美元的全额物业说率',
  15.         'PTRATIO':'城镇师生比',
  16.         'B':'城镇黑人比例',
  17.         'LSTAT':'低收入人口所占比例',
  18.         'PRICE':'房价'
  19.     }
  20.     if request in control.keys():
  21.         # 获取价格的最大值和最小值
  22.         max=np.max(data['PRICE'])
  23.         min=np.min(data['PRICE'])
  24.         # 存储最大值和最小值,对应的x轴标签,y轴的标签
  25.         request_data=list((max,min,control[request],control['PRICE']))
  26.         return request_data
  27.     else:
  28.         print('你输入的数据不存在,请查看相关的文档,查看你想要的数据类型')
复制代码
用于处理绘图前的准备工作,获取对应的数据和标签
绘图
  1. import matplotlib
  2. import matplotlib.pyplot as plt
  3. from models.chart.beforedraw import beforedraw
  4. from models.CleanData.resolvedata import resolve_data
  5. # 画图类
  6. class draw:
  7.     def __init__(self,request):
  8.         self.data=resolve_data.get_data()
  9.         matplotlib.rc('font',family='SimHei')
  10.         plt.rcParams['axes.unicode_minus']=False
  11.         before_draw=beforedraw.get_request(request,self.data)
  12.         self.x_ticks_max=before_draw[0]
  13.         self.x_ticks_min=before_draw[1]
  14.         self.x_label=before_draw[2]
  15.         self.y_label=before_draw[3]
  16.         self.request=request
  17.     def draw_sactter(self):
  18.         plt.scatter(self.data['PRICE'],self.data[self.request])
  19.         plt.title(f'{self.x_label}与{self.y_label}的散点图')
  20.         plt.xlabel(self.x_label)
  21.         plt.ylabel(self.y_label)
  22.         plt.xticks((range(int(self.x_ticks_min),int(self.x_ticks_max),10)))
  23.         plt.grid()
  24.         plt.show()
  25.     def draw_polt(self,title,x_data,y_data,x_label=None,y_label=None):
  26.         plt.plot(x_data,y_data)
  27.         plt.title(title)
  28.         plt.xlabel(x_label)
  29.         plt.ylabel(y_label)
  30.         plt.show()
  31.     def draw_bar(self,title,x_data,y_data,x_label=None,y_label=None):
  32.         plt.bar(x_data,y_data)
  33.         plt.title(title)
  34.         plt.xlabel(x_label)
  35.         plt.ylabel(y_label)
  36.         plt.show()
复制代码
将绘图封装成类,便于后期的绘图
四.对数据进行分析
分别实现房价与各参数的线性回归分析,绘制出房价的预测值;蚕蛹逻辑回归分析,对是否居住在河边进行逻辑回归分析
  1. import numpy as np
  2. import pandas as pd
  3. from matplotlib import pyplot as plt
  4. from sklearn.model_selection import train_test_split
  5. from models.CleanData.resolvedata import resolve_data
  6. from models.chart.draw import draw
  7. from sklearn.preprocessing import StandardScaler
  8. from sklearn.impute import SimpleImputer
  9. from sklearn.linear_model import LinearRegression
  10. # 回归/分类模型的评价方法
  11. from sklearn.metrics import mean_squared_error  #MSE
  12. from sklearn.metrics import mean_absolute_error #MAE
  13. # 分类
  14. from sklearn.linear_model import LogisticRegression
  15. class Learning():
  16.     def __init__(self):
  17.         self.data=resolve_data.get_data()
  18.         self.values=self.data.values
  19.         self.columns=self.data.columns
  20.         self.x_train = ''
  21.         self.x_test = ''
  22.         self.y_train = ''
  23.         self.y_test = ''
  24.         self.train_test_split_linear()
  25.         self.draw=draw.draw("ZN")
  26.         self.fill_nan()
  27.         self.log()
  28.     # 切分数据集
  29.     def train_test_split_linear(self):
  30.         self.x_train,self.x_test,self.y_train,self.y_test=train_test_split(self.values[:,0:-1],self.values[:,-1],test_size=0.2)
  31.     # 弥补缺失值
  32.     def fill_nan(self,):
  33.         if sum(self.data.isnull().sum())!=0:
  34.             simple_imp=SimpleImputer(missing_values=np.nan,strategy='mean')
  35.             self.data=simple_imp.fit(self.data)
  36.         self.standard_scaler()
  37.     # 归一化
  38.     def standard_scaler(self):
  39.         scaler=StandardScaler()
  40.         # fit_transform()一般用于训练集,transform一般用于测试集
  41.         self.x_train=scaler.fit_transform(self.x_train)
  42.         self.x_test=scaler.transform(self.x_test)
  43.         self.linear()
  44.     # 线性回归
  45.     def linear(self):
  46.         linear=LinearRegression()
  47.         self.models_1=linear.fit(self.x_train,self.y_train)
  48.         # 对模型进行打分
  49.         # print(self.models.score(self.x_test,self.y_test))
  50.         self.linear_metrics()
  51.     def linear_metrics(self):
  52.         # MSE均方误差
  53.         linear_MSE=mean_squared_error(self.y_train,self.models_1.predict(self.x_train))
  54.         # RMSE均方根误差  MSE的开方
  55.         linear_RMSE=mean_squared_error(self.y_train,self.models_1.predict(self.x_train))**0.5
  56.         # MAE平均绝对误差
  57.         linear_MAE=mean_absolute_error(self.y_train,self.models_1.predict(self.x_train))
  58.         # 误差
  59.         print(f'MSE均方误差:{linear_MSE},RMSE均方根误差{linear_RMSE},MAE平均绝对误差{linear_MAE}')
  60.         # 房价预测值
  61.         self.draw.draw_polt("房价预测值",np.linspace(0,100,102),self.models_1.predict(self.x_test))
  62.     # 分类
  63.     def log(self):
  64.         # 测试集
  65.         x_log_l=self.values[:,0:1]
  66.         x_log_r=self.values[:,4:]
  67.         y_log=self.values[:,3]
  68.         x_log=np.hstack((x_log_l,x_log_r))
  69.         log=LogisticRegression()
  70.         x_train,x_test,y_train,y_test=train_test_split(x_log,y_log,test_size=0.3)
  71.         models_2=log.fit(x_train,y_train)
  72.         # 预测值
  73.         print(x_test,models_2.predict(x_test))
  74.         # 评分
  75.         print(models_2.score(x_test,y_test))
  76.         # 权重
  77.         print(models_2.coef_)
  78.         self.draw.draw_polt("权重图",np.linspace(0.1,0.9,11),models_2.coef_[0],'','')
  79.         one_array=[]
  80.         zero_array=[]
  81.         for item in models_2.predict(x_test):
  82.             if item==0:
  83.                 zero_array.append(item)
  84.             else:
  85.                 one_array.append(item)
  86.         self.draw.draw_bar("预测值计较",['0','1'],[len(zero_array),len(one_array)])
复制代码
五.结构展示
线性回归的误差分析结果

线性回归的房价预测

逻辑回归的权重图

逻辑回归的预测图

在逻辑回归中,各阐述对于是否居住于河边的影响大,对应的评分在80%以上
项目完成!!!

来源:https://www.cnblogs.com/prettyspider/p/17488440.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具