• 如果您觉得本站非常有看点，那么赶紧使用Ctrl+D 收藏吧

# 机器学习入门实战——波士顿房价预测(简单预测)

1周前 (01-12) 9次浏览

### 目录

• 前言
• 一、实验步骤及运行结果
• 1.数据分析
• ①.分析各个影响房价的特征信息
• ②.对房价的分析
• 2.数据处理
• 3.建模测试并运行
• 二、实验结果分析

# 一、实验步骤及运行结果

## 1.数据分析

### ①.分析各个影响房价的特征信息

``````import numpy as np
from sklearn.datasets import load_boston  # 导入数据集
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

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()

``````

1940年以前建成的业主自住单位的占比：对房价的影响较小。

### ②.对房价的分析

``````import numpy as np
from sklearn.datasets import load_boston  # 导入数据集
import matplotlib.pyplot as plt
from matplotlib.pyplot import MultipleLocator

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()

``````

## 3.建模测试并运行

``````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

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中的三种模型进行预测，支持向量机是目前最常用效果最好的分类器之一，但是其消耗的空间和时间代价太大，所以需要结合实际情况使用。