利用波士顿房价数据集实现房价预测
生活随笔
收集整理的這篇文章主要介紹了
利用波士顿房价数据集实现房价预测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、 觀察波士頓房價數據并加載數據集
- 1、加載數據集
- 二、 特征選擇
- 三、 模型選擇
- 四、 模型訓練和測試
- 1、 訓練模型
- 2、打印線性方程參數
- 3、模型預測
- 4、 計算mae、mse
- 5、 畫出學習曲線
- 五、 模型性能評估和優化
- 1、 模型優化,考慮用二項式和三項式優化
- 2、 劃分數據集函數
- 3、定義MAE、MSE函數
- 4、定義多項式模型函數
- 5、 訓練模型
- 6、 定義畫出學習曲線的函數
- 7、定義1、2、3次多項式
- 8、劃分數據集
- 9、訓練模型,并打印train score
- 10、畫出學習曲線
- 六、 結論與分析
一、 觀察波士頓房價數據并加載數據集
1、加載數據集
from sklearn.datasets import load_boston import pandas as pd import matplotlib.pyplot as plt import numpy as npboston=load_boston() df=pd.DataFrame(boston.data,columns=boston.feature_names) df['target']=boston.target數據集共506條,包含有13個與房價相關的特征,分別是:
| CRIM | 城鎮人均犯罪率 |
| ZN | 住宅用地所占比例 |
| INDUS | 城鎮中非住宅用地所占比例 |
| CHAS | 虛擬變量,用于回歸分析 |
| NOX | 環保指數 |
| RM | 每棟住宅的房間數 |
| AGE | 1940 年以前建成的自住單位的比例 |
| DIS | 距離 5 個波士頓的就業中心的加權距離 |
| RAD | 距離高速公路的便利指數 |
| TAX | 每一萬美元的不動產稅率 |
| PTRATIO | 城鎮中的教師學生比例 |
| B | 城鎮中的黑人比例 |
| LSTAT | 地區中有多少房東屬于低收入人群 |
2、查看數據項
#查看數據項 df.head()二、 特征選擇
1、 畫出各數據項和房價的散點圖
2、 根據散點圖粗略選擇CRIM, RM, LSTAT三個特征值
三、 模型選擇
利用多元線性回歸模型,其中自變量為數據集中的 feature_names 的維度(13維度),因變量為數據集中的 target 維度(房價)
#數據集劃分 split_num=int(len(features)*0.8) X_train=features[:split_num] Y_train=target[:split_num] X_test=features[split_num:] Y_test=target[split_num:]設置標簽字段,切分數據集:訓練集80%,測試集20%
四、 模型訓練和測試
1、 訓練模型
split_num=int(len(features)*0.8) X_train=features[:split_num] Y_train=target[:split_num] X_test=features[split_num:] Y_test=target[split_num:]2、打印線性方程參數
print(model.coef_,model.intercept_)3、模型預測
preds=model.predict(X_test)4、 計算mae、mse
def mae_value(y_true,y_pred):n=len(y_true)mae=sum(np.abs(y_true-y_pred))/n return maedef mse_value(y_true,y_pred):n=len(y_true)mse=sum(np.square(y_true-y_pred))/n return msemae=mae_value(Y_test.values,preds) mse=mse_value(Y_test.values,preds) print("MAE",mae) print("MSE",mse)5、 畫出學習曲線
from sklearn.model_selection import learning_curve from sklearn.model_selection import ShuffleSplit import matplotlib.pyplot as plt import numpy as np def plot_learning_curve(plt,estimator,title,X,y,ylim=None,cv=None,n_jobs=1,train_sizes=np.linspace(.1,1.0,5)):plt.title(title)if ylim is not None:plt.ylim(ylim)plt.xlabel("Training examples")plt.ylabel("Score")train_sizes,train_scores,test_scores=learning_curve(estimator,X,y,cv=cv,n_jobs=n_jobs,train_sizes=train_sizes)train_scores_mean=np.mean(train_scores,axis=1)train_scores_std=np.std(train_scores,axis=1)test_scores_mean=np.mean(test_scores,axis=1)test_scores_std=np.std(test_scores,axis=1)plt.grid()plt.fill_between(train_sizes,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.1,color="r")plt.fill_between(train_sizes,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.1,color="g")plt.plot(train_sizes,train_scores_mean,'o--',color="r",label="Training scores")plt.plot(train_sizes,test_scores_mean,'o-',color="g",label="Cross-validation score")plt.legend(loc="best")return pltcv=ShuffleSplit(n_splits=10,test_size=0.2,random_state=0) plt.figure(figsize=(10,6)) plot_learning_curve(plt,model,"Learn Curve for LinearRegression",features,target,ylim=None,cv=cv) plt.show()五、 模型性能評估和優化
1、 模型優化,考慮用二項式和三項式優化
import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import load_boston from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline import Pipeline from sklearn.model_selection import ShuffleSplit from sklearn.model_selection import learning_curve2、 劃分數據集函數
def split_data():boston = load_boston()x = boston.datay = boston.targetprint(boston.feature_names)x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2,random_state=2)return (x, y, x_train, x_test, y_train, y_test)3、定義MAE、MSE函數
def mae_value(y_true,y_pred):n=len(y_true)mae=sum(np.abs(y_true-y_pred))/nreturn maedef mse_value(y_true,y_pred):n=len(y_true)mse=sum(np.square(y_true-y_pred))/n return mse4、定義多項式模型函數
def polynomial_regression(degree=1):polynomial_features = PolynomialFeatures(degree=degree, include_bias=False)#模型開啟數據歸一化linear_regression_model = LinearRegression(normalize=True)model = Pipeline([("polynomial_features", polynomial_features),("linear_regression", linear_regression_model)])return model5、 訓練模型
def train_model(x_train, x_test, y_train, y_test, degrees): res = []for degree in degrees:model = polynomial_regression(degree)model.fit(x_train, y_train)train_score = model.score(x_train, y_train)test_score = model.score(x_test, y_test)res.append({"model": model, "degree": degree, "train_score": train_score, "test_score": test_score})preds=model.predict(x_test)mae=mae_value(y_test,preds)mse=mse_value(y_test,preds)print(" degree: " ,degree, " MAE:",mae," MSE",mse)for r in res:print("degree: {}; train score: {}; test_score: {}".format(r["degree"], r["train_score"], r["test_score"]))return res6、 定義畫出學習曲線的函數
def plot_learning_curve(plt,estimator,title,X,y,ylim=None,cv=None,n_jobs=1,train_sizes=np.linspace(.1,1.0,5)):plt.title(title)if ylim is not None:plt.ylim(ylim)plt.xlabel("Training examples")plt.ylabel("Score")train_sizes,train_scores,test_scores=learning_curve(estimator,X,y,cv=cv,n_jobs=n_jobs,train_sizes=train_sizes)train_scores_mean=np.mean(train_scores,axis=1)train_scores_std=np.std(train_scores,axis=1)test_scores_mean=np.mean(test_scores,axis=1)test_scores_std=np.std(test_scores,axis=1)plt.grid()plt.fill_between(train_sizes,train_scores_mean-train_scores_std,train_scores_mean+train_scores_std,alpha=0.1,color="r")plt.fill_between(train_sizes,test_scores_mean-test_scores_std,test_scores_mean+test_scores_std,alpha=0.1,color="g")plt.plot(train_sizes,train_scores_mean,'o--',color="r",label="Training scores")plt.plot(train_sizes,test_scores_mean,'o-',color="g",label="Cross-validation score")plt.legend(loc="best")return plt7、定義1、2、3次多項式
degrees = [1,2,3]8、劃分數據集
x, y, x_train, x_test, y_train, y_test = split_data()9、訓練模型,并打印train score
res = train_model(x_train, x_test, y_train, y_test, degrees)10、畫出學習曲線
cv = ShuffleSplit(n_splits=10, test_size=0.2, random_state=0) plt.figure(figsize=(10, 6))for index, data in enumerate(res):plot_learning_curve(plt, data["model"], "degree %d"%data["degree"], x, y, cv=cv) plt.show()
六、 結論與分析
通過對波士頓房價數據的分析預測練習,運用多元回歸模型(一共十三個維度),前期訓練量不足導致擬合程度不理想。經過模型的參數優化,采用了全部特征值,結果顯示一次多項式訓練準確度72%,測試準確度76%。二次多項式訓練準確度92%,測試準確度89%,mae=2.36, mse=8.67。綜上所述,采用二次多項式回歸方法優化效果較好。
總結
以上是生活随笔為你收集整理的利用波士顿房价数据集实现房价预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim 设置支持鼠标
- 下一篇: 电脑连接不上wifi,怎么办?