基于sklearn线性回归算法预测波士顿房价
本文最后更新于1052 天前,其中的信息可能已经过时,如有错误请发送邮件到2192492965@qq.com

预测波士顿房价-线性回归

方向

​ 使用Python的sklearn类库,利用sklearn中集成的波士顿房价数据,以此来对线性回归的理论知识进行一次实践。美国波士顿房价的数据集是sklearn里面默认的数据集之一,sklearn内置的数据集都位于datasets子模块下。一共506套房屋的数据,每个房屋有13个特征值。

线性回归简介

线性回归一般可以用来解决连续值变量预测问题,针对的是数值型的样本。用来探索自变量和因变量之间的线性相关关系。
线性回归就是值利用样本,产生拟合方程,回归的求解就是求这个回归方程的回归系数。一旦我们得到了这个方程,预测的方法当然十分简单,回归系数乘上输入值再全部相加就得到了预测值。

实践

  1. 导入数据集

    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
  2. 导入模型

    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 # 支持向量机
  3. 数据集生成与切割

    # 生成训练数据和测试数据
    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%的测试集
    
  4. 查看一下数据

    # 可视化
    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 底层人群比例
    房价值 房屋价值中值
  5. 实例化模型

    # 创建模型
    knn = KNeighborsRegressor()
    linear = LinearRegression()
    ridge = Ridge()
    lasso = Lasso()
    decision = DecisionTreeRegressor()
    svr = SVR()
  6. 训练模型

    # 训练模型
    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)
  7. 预测

    # 预测数据
    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值
  8. 评分

    # 评分,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
  9. 绘图

    # 制图
    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()  # 展示
如果觉得本文对您有所帮助,可以支持下博主,一分也是缘?
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
隐藏
换装