基于回歸分析的波士頓房價分析
項目實現(xiàn)步驟:
1.項目結構
2.處理數(shù)據
3.處理繪圖
4.對數(shù)據進行分析
5.結果展示
一.項目結構
二.處理數(shù)據
from sklearn import datasets
import pandas as pd
"""
sklearn1.2版本后不在保留load_boston數(shù)據集,
可用
"""
def get_data():
# 獲取波士頓數(shù)據
# data_url = "http://lib.stat.cmu.edu/datasets/boston"
# raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
# print(raw_df)
# # 輸入
# boston_x = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
# # 輸出
# boston_y= raw_df.values[1::2, 2]
# # 自作數(shù)據集
# boston=pd.DataFrame(boston_x)
# print(boston)
boston=datasets.load_boston()
# 輸入
boston_x=boston.data
# 輸出
boston_y=boston.target
# 自制數(shù)據集
boston_new=pd.DataFrame(boston_x)
boston_new.columns=boston["feature_names"]
boston_new['PRICE']=boston_y
# 保存數(shù)據
# boston_new.to_csv('./models/Data/boston.csv')
return boston_new
使用sklearn的datasets時,對應的波士頓房價數(shù)據已經被“移除”,在獲取數(shù)據時,會出現(xiàn)
,此時,在該提示的下方會有相關的解決方法
不建議使用提供的方法,對應方法的數(shù)據與具體實現(xiàn)項目的數(shù)據有誤差
三.處理繪圖
1.繪圖前準備
import numpy as np
def get_request(request,data):
# 要處理的數(shù)據
# 設置初始值
control={
'CRIM':'城鎮(zhèn)人均犯罪率',
'ZN':'占地面接超過5萬平方米英尺的住宅用地面積',
'INDUS':'城鎮(zhèn)非零售業(yè)務的比例',
'CHAS':'查爾斯河虛擬變量',
'NOX':'一氧化碳濃度',
'RM':'平均每個居民擁有的房數(shù)',
'AGE':'在1940年前建成的所有者占用單位的比例',
'DIS':'與五個波士頓就業(yè)中心的加權距離',
'TAX':'每10000美元的全額物業(yè)說率',
'PTRATIO':'城鎮(zhèn)師生比',
'B':'城鎮(zhèn)黑人比例',
'LSTAT':'低收入人口所占比例',
'PRICE':'房價'
}
if request in control.keys():
# 獲取價格的最大值和最小值
max=np.max(data['PRICE'])
min=np.min(data['PRICE'])
# 存儲最大值和最小值,對應的x軸標簽,y軸的標簽
request_data=list((max,min,control[request],control['PRICE']))
return request_data
else:
print('你輸入的數(shù)據不存在,請查看相關的文檔,查看你想要的數(shù)據類型')
用于處理繪圖前的準備工作,獲取對應的數(shù)據和標簽
繪圖
import matplotlib
import matplotlib.pyplot as plt
from models.chart.beforedraw import beforedraw
from models.CleanData.resolvedata import resolve_data
# 畫圖類
class draw:
def __init__(self,request):
self.data=resolve_data.get_data()
matplotlib.rc('font',family='SimHei')
plt.rcParams['axes.unicode_minus']=False
before_draw=beforedraw.get_request(request,self.data)
self.x_ticks_max=before_draw[0]
self.x_ticks_min=before_draw[1]
self.x_label=before_draw[2]
self.y_label=before_draw[3]
self.request=request
def draw_sactter(self):
plt.scatter(self.data['PRICE'],self.data[self.request])
plt.title(f'{self.x_label}與{self.y_label}的散點圖')
plt.xlabel(self.x_label)
plt.ylabel(self.y_label)
plt.xticks((range(int(self.x_ticks_min),int(self.x_ticks_max),10)))
plt.grid()
plt.show()
def draw_polt(self,title,x_data,y_data,x_label=None,y_label=None):
plt.plot(x_data,y_data)
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
plt.show()
def draw_bar(self,title,x_data,y_data,x_label=None,y_label=None):
plt.bar(x_data,y_data)
plt.title(title)
plt.xlabel(x_label)
plt.ylabel(y_label)
plt.show()
將繪圖封裝成類,便于后期的繪圖
四.對數(shù)據進行分析
分別實現(xiàn)房價與各參數(shù)的線性回歸分析,繪制出房價的預測值;蠶蛹邏輯回歸分析,對是否居住在河邊進行邏輯回歸分析
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from models.CleanData.resolvedata import resolve_data
from models.chart.draw import draw
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LinearRegression
# 回歸/分類模型的評價方法
from sklearn.metrics import mean_squared_error #MSE
from sklearn.metrics import mean_absolute_error #MAE
# 分類
from sklearn.linear_model import LogisticRegression
class Learning():
def __init__(self):
self.data=resolve_data.get_data()
self.values=self.data.values
self.columns=self.data.columns
self.x_train = ''
self.x_test = ''
self.y_train = ''
self.y_test = ''
self.train_test_split_linear()
self.draw=draw.draw("ZN")
self.fill_nan()
self.log()
# 切分數(shù)據集
def train_test_split_linear(self):
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)
# 彌補缺失值
def fill_nan(self,):
if sum(self.data.isnull().sum())!=0:
simple_imp=SimpleImputer(missing_values=np.nan,strategy='mean')
self.data=simple_imp.fit(self.data)
self.standard_scaler()
# 歸一化
def standard_scaler(self):
scaler=StandardScaler()
# fit_transform()一般用于訓練集,transform一般用于測試集
self.x_train=scaler.fit_transform(self.x_train)
self.x_test=scaler.transform(self.x_test)
self.linear()
# 線性回歸
def linear(self):
linear=LinearRegression()
self.models_1=linear.fit(self.x_train,self.y_train)
# 對模型進行打分
# print(self.models.score(self.x_test,self.y_test))
self.linear_metrics()
def linear_metrics(self):
# MSE均方誤差
linear_MSE=mean_squared_error(self.y_train,self.models_1.predict(self.x_train))
# RMSE均方根誤差 MSE的開方
linear_RMSE=mean_squared_error(self.y_train,self.models_1.predict(self.x_train))**0.5
# MAE平均絕對誤差
linear_MAE=mean_absolute_error(self.y_train,self.models_1.predict(self.x_train))
# 誤差
print(f'MSE均方誤差:{linear_MSE},RMSE均方根誤差{linear_RMSE},MAE平均絕對誤差{linear_MAE}')
# 房價預測值
self.draw.draw_polt("房價預測值",np.linspace(0,100,102),self.models_1.predict(self.x_test))
# 分類
def log(self):
# 測試集
x_log_l=self.values[:,0:1]
x_log_r=self.values[:,4:]
y_log=self.values[:,3]
x_log=np.hstack((x_log_l,x_log_r))
log=LogisticRegression()
x_train,x_test,y_train,y_test=train_test_split(x_log,y_log,test_size=0.3)
models_2=log.fit(x_train,y_train)
# 預測值
print(x_test,models_2.predict(x_test))
# 評分
print(models_2.score(x_test,y_test))
# 權重
print(models_2.coef_)
self.draw.draw_polt("權重圖",np.linspace(0.1,0.9,11),models_2.coef_[0],'','')
one_array=[]
zero_array=[]
for item in models_2.predict(x_test):
if item==0:
zero_array.append(item)
else:
one_array.append(item)
self.draw.draw_bar("預測值計較",['0','1'],[len(zero_array),len(one_array)])
五.結構展示
線性回歸的誤差分析結果
線性回歸的房價預測
邏輯回歸的權重圖
邏輯回歸的預測圖
在邏輯回歸中,各闡述對于是否居住于河邊的影響大,對應的評分在80%以上文章來源:http://www.zghlxwxcb.cn/news/detail-487916.html
項目完成?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-487916.html
到了這里,關于基于回歸分析的波士頓房價分析的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!