提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
波士顿房价预测是一个经典的机器学习任务,类似于程序员世界的“Hello World”。利用机器学习方法完成波士顿房价的预测。理解机器学习解决简单实际问题的基本步骤和方法。
import numpy as np
from sklearn.datasets import load_boston # 导入数据集
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
boston = load_boston()
x = boston['data'] # 影响房价的特征信息
y = boston['target'] # 房价
name = boston['feature_names']
for i in range(13):
plt.figure(figsize=(10, 7))
plt.grid()
plt.scatter(x[:, i], y, s=5) # 横纵坐标和点的大小
plt.title(name[i])
print(name[i], np.corrcoef(x[:i]), y)
plt.show()
运行结果:
犯罪率:高房价的房屋大都集中在低犯罪率地区。
住宅用地比例:与房价无明显的线性关系。
城镇中非商业用地的所占比例:与房价无明显的线性关系,只能说在某一区间内房价呈现一定特征。
是否处于查尔斯河边(1表示在河边,0表示不在河边):是否在查尔斯河边影响房价也不明显。
一氧化氮浓度: 一氧化氮浓度与房价的关系呈现极其微弱的线性关系,一氧化氮低于0.5的情况下,房价绝大部分高于15。
距离5个波士顿就业中心的平均距离:平均距离较小的情况下,房价对应也较低。
距离高速公路的便利指数:房价高于30的房产,近乎都集中在距离高速公路的便利指数低的地区。
黑人比例:黑人比例对波士顿房价的影响尤其是往后的影响越趋于更小。
低收入阶层占比:与房价具有较强的线性关系,是影响房价的重要因素。
import numpy as np
from sklearn.datasets import load_boston # 导入数据集
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator
boston = load_boston()
x = boston['data'] # 影响房价的特征信息
y = boston['target'] # 房价
plt.figure(figsize=(20, 15))
y_major_locator = MultipleLocator(5) # 把y轴的刻度间隔设置为10,并存在变量里
ax = plt.gca() # ax为两条坐标轴的实例
ax.yaxis.set_major_locator(y_major_locator) # 把y轴的主刻度设置为5的倍数
plt.ylim(0, 51)
plt.grid()
for i in range(len(y)):
plt.scatter(i, y[i], s=20)
plt.show()
运行结果:
经分析,将房价大于等于46的数据视为异常数据,在划分训练集和测试集之前先把这些数据从数据集中除去。
经上述分析,去除房价中大于等于46的数据,对于房价的影响信息,只保留NOX,RM,AGE,DIS,LSTAT, INDUS, PTRATIO几个特征信息,将剩下的特征信息均除去。
import numpy as np
import numpy as np
from skimage.metrics import mean_squared_error
from sklearn import linear_model
from sklearn.linear_model import LinearRegression # 导入线性模型
from sklearn.datasets import load_boston # 导入数据集
from sklearn.metrics import r2_score
from sklearn.model_selection import train_test_split # 导入数据集划分模块
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt2
boston = load_boston()
x = boston['data'] # 影响房价的特征信息数据
y = boston['target'] # 房价
name = boston['feature_names']
# 数据处理
unsF = [] # 次要特征下标
for i in range(len(name)):
if name[i] == 'RM' or name[i] == 'PTRATIO' or name[i] == 'LSTAT' or name[i] == 'AGE' or name[i] == 'NOX' or name[i] == 'DIS' or name[i] == 'INDUS':
continue
unsF.append(i)
x = np.delete(x, unsF, axis=1) # 删除次要特征
unsT = [] # 房价异常值下标
for i in range(len(y)):
if y[i] > 46:
unsT.append(i)
x = np.delete(x, unsT, axis=0) # 删除样本异常值数据
y = np.delete(y, unsT, axis=0) # 删除异常房价
# 将数据进行拆分,一份用于训练,一份用于测试和验证
# 测试集大小为30%,防止过拟合
# 这里的random_state就是为了保证程序每次运行都分割一样的训练集和测试集。
# 否则,同样的算法模型在不同的训练集和测试集上的效果不一样。
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
# 线性回归模型
lf = LinearRegression()
lf.fit(x_train, y_train) # 训练数据,学习模型参数
y_predict = lf.predict(x_test) # 预测
# 岭回归模型
# rr = linear_model.Ridge() # 模型岭回归
# rr.fit(x_train, y_train) # 训练模型
# y_predict = rr.predict(x_test) # 预测
# lasso模型
# lassr = linear_model.Lasso(alpha=.0001)
# lassr.fit(x_train, y_train)
# y_predict = lassr.predict(x_test)
# 与验证值作比较
error = mean_squared_error(y_test, y_predict).round(5) # 平方差
score = r2_score(y_test, y_predict).round(5) # 相关系数
# 绘制真实值和预测值的对比图
fig = plt.figure(figsize=(13, 7))
plt.rcParams['font.family'] = "sans-serif"
plt.rcParams['font.sans-serif'] = "SimHei"
plt.rcParams['axes.unicode_minus'] = False # 绘图
plt.plot(range(y_test.shape[0]), y_test, color='red', linewidth=1, linestyle='-')
plt.plot(range(y_test.shape[0]), y_predict, color='blue', linewidth=1, linestyle='dashdot')
plt.legend(['真实值', '预测值'])
plt.title("190512213", fontsize=20)
error = "标准差d=" + str(error)+"\n"+"相关指数R^2="+str(score)
plt.xlabel(error, size=18, color="green")
plt.grid()
plt.show()
plt2.rcParams['font.family'] = "sans-serif"
plt2.rcParams['font.sans-serif'] = "SimHei"
plt2.title('190512213', fontsize=24)
xx = np.arange(0, 40)
yy = xx
plt2.xlabel('* truth *', fontsize=14)
plt2.ylabel('* predict *', fontsize=14)
plt2.plot(xx, yy)
plt2.scatter(y_test, y_predict, color='red')
plt2.grid()
plt2.show()
Lasso模型:
1.由本次实验结果与真实值的对比图可知,无论使用哪种模型预测,预测效果都不是很理想,主要原因仍是数据分析及处理过程中出现了问题。在预测时,应该对数据进行进一步的分析和处理,如对应区间内数据的变化,对极端数据的处理等等。
2.实验采用了相关系数和平方差两种手段去评判预测结果的好坏。相关系数越接近1说明选用的模型回归的效果越好,预测的结果也就越优,在实际解决问题时,应该测试多个模型选用最优的模型进行预测。
3.除了实验中选择的三种模型,还可以进一步利用支持向量机的核函数,SVR中的三种模型进行预测,支持向量机是目前最常用效果最好的分类器之一,但是其消耗的空间和时间代价太大,所以需要结合实际情况使用。