本文最后更新于1052 天前,其中的信息可能已经过时,如有错误请发送邮件到2192492965@qq.com
预测波士顿房价-线性回归
方向
使用Python的sklearn类库,利用sklearn中集成的波士顿房价数据,以此来对线性回归的理论知识进行一次实践。美国波士顿房价的数据集是sklearn里面默认的数据集之一,sklearn内置的数据集都位于datasets子模块下。一共506套房屋的数据,每个房屋有13个特征值。
线性回归简介
线性回归一般可以用来解决连续值变量预测问题,针对的是数值型的样本。用来探索自变量和因变量之间的线性相关关系。
线性回归就是值利用样本,产生拟合方程,回归的求解就是求这个回归方程的回归系数。一旦我们得到了这个方程,预测的方法当然十分简单,回归系数乘上输入值再全部相加就得到了预测值。
实践
-
导入数据集
from sklearnex import patch_sklearn,unpatch_sklearn patch_sklearn() # 利用sklearnex模块加速sklearn算法 from sklearn.datasets import load_boston # 导入波士顿房价数据集 from sklearn.model_selection import train_test_split import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings # 配置工具 warnings.filterwarnings('ignore') # 解决波士顿房价的warnings报错 plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体解决中文乱码问题 plt.rcParams['axes.unicode_minus'] = False # 正常显示负号 pd.set_option('display.max_columns', None) # 设置显示所有列 pd.set_option('max_colwidth', 100) # 设置value的最大长度为100,默认50 -
导入模型
from sklearn.neighbors import KNeighborsRegressor # KNN,即K近邻算法 from sklearn.linear_model import LinearRegression,Ridge,Lasso # 多元线性回归算法 线性回归算法Ridge回归,岭回归 线性回归算法Lasso回归,可用作特征筛选 from sklearn.tree import DecisionTreeRegressor # 决策树,既可以做分类也可以做回归(本文主要用于分类问题) from sklearn.svm import SVR # 支持向量机 -
数据集生成与切割
# 生成训练数据和测试数据 boston = load_boston() train, target = boston.data, boston.target # 样本,标签 # 切割样本 X_train, x_test, Y_train, y_test = train_test_split(train, target, test_size=0.2) # 切割出20%的测试集 -
查看一下数据
# 可视化 df = pd.DataFrame(train, columns=boston.feature_names) df['房价值'] = target print(df.head(10))结果
CRIM ZN INDUS CHAS NOX RM AGE DIS RAD TAX \ 0 0.00632 18.0 2.31 0.0 0.538 6.575 65.2 4.0900 1.0 296.0 1 0.02731 0.0 7.07 0.0 0.469 6.421 78.9 4.9671 2.0 242.0 2 0.02729 0.0 7.07 0.0 0.469 7.185 61.1 4.9671 2.0 242.0 3 0.03237 0.0 2.18 0.0 0.458 6.998 45.8 6.0622 3.0 222.0 4 0.06905 0.0 2.18 0.0 0.458 7.147 54.2 6.0622 3.0 222.0 5 0.02985 0.0 2.18 0.0 0.458 6.430 58.7 6.0622 3.0 222.0 6 0.08829 12.5 7.87 0.0 0.524 6.012 66.6 5.5605 5.0 311.0 7 0.14455 12.5 7.87 0.0 0.524 6.172 96.1 5.9505 5.0 311.0 8 0.21124 12.5 7.87 0.0 0.524 5.631 100.0 6.0821 5.0 311.0 9 0.17004 12.5 7.87 0.0 0.524 6.004 85.9 6.5921 5.0 311.0 PTRATIO B LSTAT 房价值 0 15.3 396.90 4.98 24.0 1 17.8 396.90 9.14 21.6 2 17.8 392.83 4.03 34.7 3 18.7 394.63 2.94 33.4 4 18.7 396.90 5.33 36.2 5 18.7 394.12 5.21 28.7 6 15.2 395.60 12.43 22.9 7 15.2 396.90 19.15 27.1 8 15.2 386.63 29.93 16.5 9 15.2 386.71 17.10 18.9 进程已结束,退出代码为 0表中列名代表的意思
代称 全称 CRIM 人均犯罪率 ZN 住宅用地超过两万五千平方英尺的比例 INDUS 城镇的非零售营业比例 CHAS 河流分界 NOX 一氧化氮浓度 RM 平均住宅房间数 AGE 1940年之前建造的房屋业主比例 DIS 距离波士顿五个就业中心的加权距离 RAD 径向公路的可达指数 TAX 每一万美元财产的全额财产税率 PTEATIO 城乡教师比例 B 黑人比例 LASTAT 底层人群比例 房价值 房屋价值中值 -
实例化模型
# 创建模型 knn = KNeighborsRegressor() linear = LinearRegression() ridge = Ridge() lasso = Lasso() decision = DecisionTreeRegressor() svr = SVR() -
训练模型
# 训练模型 knn.fit(X_train, Y_train) linear.fit(X_train, Y_train) ridge.fit(X_train, Y_train) lasso.fit(X_train, Y_train) decision.fit(X_train, Y_train) svr.fit(X_train, Y_train) -
预测
# 预测数据 y_pre_knn = knn.predict(x_test) y_pre_linear = linear.predict(x_test) y_pre_ridge = ridge.predict(x_test) y_pre_lasso = lasso.predict(x_test) y_pre_decision = decision.predict(x_test) y_pre_svr = svr.predict(x_test) # linear.coef_ w值 # linear.intercept_ b值 -
评分
# 评分,R2 决定系数(拟合优度)。模型越好:r2越趋近于1 模型越差:r2越趋近于0 knn_score = r2_score(y_test, y_pre_knn) linear_score = r2_score(y_test, y_pre_linear) ridge_score = r2_score(y_test, y_pre_ridge) lasso_score = r2_score(y_test, y_pre_lasso) decision_score = r2_score(y_test, y_pre_decision) svr_score = r2_score(y_test, y_pre_svr)拟合优度
拟合优度: knn: 0.4389044268858555 linear: 0.7418879898878414 ridge: 0.7359998493144555 lasso: 0.6448358141495696 decision: 0.8562208344508881 svr: 0.1954448621545567 -
绘图
# 制图 plt.plot(y_test, label='实际值') plt.plot(y_pre_knn, label='knn预测') plt.plot(y_pre_linear, label='linear预测') plt.plot(y_pre_ridge, label='ridge预测') plt.plot(y_pre_lasso, label='lasso预测') plt.plot(y_pre_decision, label='decision预测') plt.plot(y_pre_svr, label='svr预测') plt.legend() plt.savefig('波士顿房价预测结果.jpg') # 保存为'波士顿房价预测结果.jpg' plt.show() # 展示
结论
通过观察拟合优度和结果图可发现decision(决策树)预测模型为最优
整体代码
import pandas as pd
import matplotlib.pyplot as plt
import warnings
from sklearnex import patch_sklearn
patch_sklearn() # 利用sklearnex模块加速sklearn算法
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score
from sklearn.neighbors import KNeighborsRegressor # KNN,即K近邻算法
from sklearn.linear_model import LinearRegression, Ridge, Lasso # 多元线性回归算法 线性回归算法Ridge回归,岭回归 线性回归算法Lasso回归,可用作特征筛选
from sklearn.tree import DecisionTreeRegressor # 决策树,既可以做分类也可以做回归(本文主要用于分类问题)
from sklearn.svm import SVR # 支持向量机
warnings.filterwarnings('ignore') # 解决波士顿房价的warnings报错
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定字体解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
pd.set_option('display.max_columns', None) # 设置显示所有列
pd.set_option('max_colwidth', 100) # 设置value的最大长度为100,默认50
# 生成训练数据和测试数据
boston = load_boston()
train, target = boston.data, boston.target # 样本,标签
# 切割样本
X_train, x_test, Y_train, y_test = train_test_split(train, target, test_size=0.2) # 切割出20%的测试集
# 可视化
df = pd.DataFrame(train, columns=boston.feature_names)
df['房价值'] = target
# print(df.head(10))
# 创建模型
knn = KNeighborsRegressor()
linear = LinearRegression()
ridge = Ridge()
lasso = Lasso()
decision = DecisionTreeRegressor()
svr = SVR()
# 训练模型
knn.fit(X_train, Y_train)
linear.fit(X_train, Y_train)
ridge.fit(X_train, Y_train)
lasso.fit(X_train, Y_train)
decision.fit(X_train, Y_train)
svr.fit(X_train, Y_train)
# 预测数据
y_pre_knn = knn.predict(x_test)
y_pre_linear = linear.predict(x_test)
y_pre_ridge = ridge.predict(x_test)
y_pre_lasso = lasso.predict(x_test)
y_pre_decision = decision.predict(x_test)
y_pre_svr = svr.predict(x_test)
# linear.coef_ w值
# linear.intercept_ b值
# 评分,R2 决定系数(拟合优度)。模型越好:r2越趋近于1 模型越差:r2越趋近于0
knn_score = r2_score(y_test, y_pre_knn)
linear_score = r2_score(y_test, y_pre_linear)
ridge_score = r2_score(y_test, y_pre_ridge)
lasso_score = r2_score(y_test, y_pre_lasso)
decision_score = r2_score(y_test, y_pre_decision)
svr_score = r2_score(y_test, y_pre_svr)
print('拟合优度:')
print('knn:', knn_score,
'\nlinear', linear_score,
'\nridge', ridge_score,
'\nlasso', lasso_score,
'\ndecision', decision_score,
'\nsvr', svr_score)
# 制图
plt.plot(y_test, label='实际值')
plt.plot(y_pre_knn, label='knn预测')
plt.plot(y_pre_linear, label='linear预测')
plt.plot(y_pre_ridge, label='ridge预测')
plt.plot(y_pre_lasso, label='lasso预测')
plt.plot(y_pre_decision, label='decision预测')
plt.plot(y_pre_svr, label='svr预测')
plt.legend()
plt.savefig('波士顿房价预测结果.jpg') # 保存为'波士顿房价预测结果.jpg'
plt.show() # 展示










