https://wenku.baidu.com/view/3a5d9638c181e53a580216fc700abb68a982ad63.html
from traceback import print_tb
import numpy as np
import pandas as pd
import sklearn as sk
from sklearn import svm
from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn import metrics
boston = load_boston() # 创建波士顿房价的数组(ndarr ay类型)
# print(boston.data) # 特征数据
# print(boston.target) # 目标数据 - 即房价
# print(boston.feature_names) # 特征名
# print(boston.DESCR) # 数据集描述,包含每个特征的含义
# print(boston.filename) # 数据集所在文件位置
# 另一种获取data和target的办法(官方推荐)
# data_url = "http://lib.stat.cmu.edu/datasets/boston"
# raw_df = pd.read_csv(data_url, sep="\s+", skiprows=22, header=None)
# data = np.hstack([raw_df.values[::2, :], raw_df.values[1::2, :2]])
# target = raw_df.values[1::2, 2]
# 将data数据 转化为 DataFrame 类 , 并指定列索引为特征名
bos = pd.DataFrame(data=boston.data, columns=boston.feature_names)
# 通常的,在sklearn中:通常用大写的 X 表示特征data(这里共有 13 个),而用小写的 y 表示预测的目标target(标签,这里有 1 个)
X = boston.data # 特征数据
y = boston.target # 要预测的数据
# 下面,我们就利用函数 train_test_split( ) 分别把 X 和 y 分割为两个测试集和训练集。
# 由于 X 和 y 都被分割为两个部分,因此需要四个变量分别来接收它们。
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
# test_size表示测试集所占份数,本例中为 30%(参数的值可以自定义,默认值为 0.25)
# random_state参数: 设置该参数不变,目的就是确保每次运行分割程序时,获得完全一样的训练集和测试集。如果不设置则默认调用np.random()函数,随机取样.
# 这会加大测试难度
# 这四个变量的名称自然可以不同,但它们的逻辑顺序一定要正确
# 它们依次为训练集的特征数据、测试集的特征数据、训练集的标签数据、测试集的标签数据。
# 数据分割完成后,就可以依次导入线性回归模型,训练模型并进行模型预测了。
# 调用svm模块中的LinerSVR构建线性回归模型
SVR = svm.LinearSVR() # 生成模型
# 在 sklearn 中,训练模型的方法统称为 fit( )。由于回归分析属于监督学习,所以 fit()函数提供两个参数,前者是特征数据,后者是标签数据。
SVR.fit(X_train, y_train) # 训练模型
y_pred = SVR.predict(X_test) # 模型预测
# precision 用来控制小数点后面最多显示的位数,suppress=True 用来取消使用科学计数法。
np.set_printoptions(precision=3, suppress=True)
print(SVR.intercept_) # 输出截距
print(SVR.coef_) # 输出每个特征的权值
# 通常来说,权值的符号为-,表明它和目标(如房价)是负相关的,针对波士顿房价数据集,这样的权值会抑制房价。
# 负值的绝对值越大,对房价的抑制程度就越大。
# 反之,如果权值的符号为+,则表明它与房价呈正相关,其值越大,表明它对房价的提升效果越好。
# 接下来,测试一下训练结果如何
print("MSE = ", metrics.mean_squared_error(y_test, y_pred))
df = pd.DataFrame({"实际房价": y_test, "预测房价": y_pred})
print(df)
# 通过图表展示
import matplotlib.pyplot as plt
import numpy as np
plt.scatter(y_test, y_pred)
plt.xlabel("Price: $Y_i$")
plt.ylabel("Predicted prices: $\hat{Y}_i$")
plt.title("Prices vs Predicted prices: $Y_i$ vs $\hat{Y}_i$")
plt.grid()
x = np.arange(0, 50)
y = x
plt.plot(x, y, color = 'red', lw = 4)
plt.text(30,40, "predict line")
plt.savefig ("price.eps")
plt.show()
# 交叉验证
scores = cross_val_score(SVR, boston.data, boston.target)
print(scores)
print(scores.mean())