当前位置:   article > 正文

机器学习之利用线性回归预测波士顿房价和可视化分析影响房价因素实战(python实现 附源码 超详细)_机器学习预测波士顿

机器学习预测波士顿

数据集和源码请点赞关注收藏后评论区留下QQ邮箱或者私信

线性回归是利用最小二乘函数对一个或多个因变量之间关系进行建模的一种回归分析,这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个变量的称为一元回归,大于一个变量的情况叫做多元回归。利用线性回归,我们可以预测一组特定数据是否在一定时期内增长或下降。

接下来以线性回归预测波士顿房价进行实战解析

线性回归代码如下

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.model_selection import train_test_split
  4. # 读数据
  5. data = np.loadtxt(boston_house_price.csv', float, delimiter=",", skiprows=1)
  6. X, y = data[:, :13], data[:, 13]
  7. # Z-score归一化
  8. for i in range(X.shape[1]):
  9. X[:, i] = (X[:, i] - np.mean(X[:, i])) / np.std(X[:, i])
  10. # 划分训练集测试集
  11. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
  12. # 将训练集测试集改为列向量的形式
  13. y_train = y_train.reshape((-1, 1))
  14. y_test = y_test.reshape((-1, 1))
  15. # 初始化模型参数
  16. def initialize_params(feature_num):
  17. w=np.random.rand(feature_num,1)
  18. b=0
  19. return w,b
  20. def forward(X, y, w, b):
  21. num_train=X.shape[0]
  22. y_hat=np.dot(X,w)+b
  23. loss=np.sum((y_hat-y)**2)/num_train
  24. dw=np.dot(X.T,(y_hat-y))/num_train
  25. db=np.sum((y_hat-y))/num_train
  26. return y_hat,loss,dw,db
  27. # 定义线性回归模型的训练过程
  28. def my_linear_regression(X, y, learning_rate, epochs):
  29. loss_his=[]
  30. w,b=initialize_params(X.shape[1])
  31. for i in range(epochs):
  32. y_hat,loss,dw,db=forward(X,y,w,b)
  33. w+=-learning_rate*dw
  34. b+=-learning_rate*db
  35. loss_his.append(loss)
  36. if i%100==0:
  37. print("epochs %d loss %f"%(i,loss))
  38. return loss_his,w,b
  39. # 线性回归模型训练
  40. loss_his, w, b = my_linear_regression(X_train, y_train, 0.01, 5000)
  41. # 打印loss曲线
  42. plt.plot(range(len(loss_his)), loss_his, linewidth=1, linestyle="solid", label="train loss")
  43. plt.show()
  44. # 打印训练后得到的模型参数
  45. print("w:", w, "\nb", b)
  46. # 定义MSE函数
  47. def MSE(y_test, y_pred):
  48. return np.sum(np.square(y_pred - y_test)) / y_pred.shape[0]
  49. # 定义R系数函数
  50. def r2_score(y_test, y_pred):
  51. # 测试集标签均值
  52. y_avg = np.mean(y_test)
  53. # 总离差平方和
  54. ss_tot = np.sum((y_test - y_avg) ** 2)
  55. # 残差平方和
  56. ss_res = np.sum((y_test - y_pred) ** 2)
  57. # R计算
  58. r2 = 1 - (ss_res / ss_tot)
  59. return r2
  60. # 在测试集上预测
  61. y_pred = np.dot(X_test, w) + b
  62. # 计算测试集的MSE
  63. print("测试集的MSE: {:.2f}".format(MSE(y_test, y_pred)))
  64. # 计算测试集的R方系数
  65. print("测试集的R2: {:.2f}".format(r2_score(y_test, y_pred)))

损失值随训练次数的变化图如下 可以看出符合肘部方法 

 

 接下来可视化分析影响房价的因素

"""
各个字段的含义:
    CRIM     犯罪率
    ZN       住宅用地所占比例
    INDUS    城镇中非商业用地所占比例
    CHAS     是否处于查尔斯河边
    NOX      一氧化碳浓度
    RM       住宅房间数
    AGE      1940年以前建成的业主自住单位的占比
    DIS      距离波士顿5个商业中心的加权平均距离
    RAD      距离高速公路的便利指数
    TAX      不动产权税
    PTRATIO  学生/教师比例
    B        黑人比例
    LSTAT    低收入阶层占比
    MEDV     房价中位数
"""

可视化结果如下 

 

 

 

 可视化部分代码如下

  1. import pandas as pd
  2. import numpy as np
  3. import seaborn as sns
  4. import matplotlib.pyplot as plt
  5. df=pd.read_csv(boston_house_price.csv',encoding='utf-8')
  6. print(df.head())
  7. df.describe()
  8. df['medv'].hist()
  9. sns.boxplot(x=df['medv'])#有点问题 要加个x传参
  10. plt.scatter(df['rm'],df['medv'])
  11. def box_plot_outliers(df,s):
  12. q1,q3=df[s].quantile(0.25),df[s].quantile(0.75)
  13. iqr=q3-q1
  14. low,up=q1-1.5*iqr,q3+1.5*iqr
  15. df=df[(df[s]>up)|(df[s]<low)]
  16. return df
  17. df_filter=box_plot_outliers(df,'rm')
  18. df_filter.mean()
  19. plt.scatter(df['dis'],df['medv'])
  20. plt.scatter(df['rad'],df['medv'])
  21. plt.scatter(df['b'],df['medv'])
  22. df.corr()
  23. plt.style.use({'figure.figsize':(15,10)})
  24. df.hist(bins=15)
  25. sns.boxplot(data=df)
  26. plt.figure(figsize=(12,22))
  27. for i in range(13):
  28. plt.subplot(4,4,(i+1))
  29. plt.scatter(df.iloc[:,i],df['medv'])
  30. plt.title('{}-price scatter'.format(df.columns[i]))
  31. plt.xlabel(df.columns[i])
  32. plt.ylabel('boston house price')
  33. plt.show()
  34. plt.tight_layout()

数据集和源码请点赞关注收藏后评论区留下QQ邮箱或者私信

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/131501
推荐阅读
相关标签
  

闽ICP备14008679号