https://wenku.baidu.com/view/3a5d9638c181e53a580216fc700abb68a982ad63.html

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