赵走x博客
网站访问量:151925
首页
书籍
软件
工具
古诗词
搜索
登录
深入浅出Python机器学习:31、自动特征选择
深入浅出Python机器学习:30、数据“升维”
深入浅出Python机器学习:29、数据表达
深入浅出Python机器学习:28、聚类算法
深入浅出Python机器学习:27、特征提取
深入浅出Python机器学习:26、数据降维
深入浅出Python机器学习:25、数据预处理
深入浅出Python机器学习:24、神经网络实例一一手写识别
深入浅出Python机器学习:23、神经网络的原理及使用
深入浅出Python机器学习:22、神经网络的前世今生
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
深入浅出Python机器学习:20、SVM 的核函数与参数选择
深入浅出Python机器学习:19、支持向量机SVM 基本概念
深入浅出Python机器学习:18、随机森林实例一一要不要和中目亲对象进一步发展
深入浅出Python机器学习:17、随机森林
深入浅出Python机器学习:16、决策树
深入浅出Python机器学习:15、朴素贝叶斯实战一一判断肿瘤是良性还是恶性
深入浅出Python机器学习:14、朴素贝叶斯算法的不同方法
深入浅出Python机器学习:13、朴素贝叶斯基本概念
深入浅出Python机器学习:12、使用L1 正则化的线性模型一一套索回归
深入浅出Python机器学习:11、使用L2 正则化的线性模型一一岭回归
深入浅出Python机器学习:10、最基本的线性模型一一线性回归
深入浅出Python机器学习:9、线性模型的墓本概念
深入浅出Python机器学习:8、K 最近邻算法项目实战一一酒的分类
深入浅出Python机器学习:7、K最近邻算法用于回归分析
深入浅出Python机器学习:6、K最近邻算法处理多元分类任务
深入浅出Python机器学习:5、k最近邻算法在分类任务中的应用
深入浅出Python机器学习:4、K 最近邻算法的原理
深入浅出Python机器学习:3、一些必需库的安装及功能简介
深入浅出Python机器学习:2、基于python i吾言的环境配置
深入浅出Python机器学习:1、概述
人脸数据集加载faces = fetch_lfw_people()报错
31、直方图
74、插件开发:Android端API实现
Python3之socket编程--3:基于UDP的套接字
15、使用 jQuery 处理 Ajax 请求
深入浅出Python机器学习:21、SVM 实例一一波士顿房价回归分析
资源编号:75916
人工智能
深入浅出Python机器学习
热度:88
前面介绍了支持向量机SVM 在分类任务中的应用,下面我们再通过一个实例来介绍SVM 在回归分析中的应用。在scikit- learn 中,内置了一个非常适合做回归分析的数据集,波士顿房价数据集,在这一小节中,我们将使用该数据集为大家讲解SVM 中用于回归分析的SVR 的用法。
前面介绍了支持向量机SVM 在分类任务中的应用,下面我们再通过一个实例来介绍SVM 在回归分析中的应用。在scikit- learn 中,内置了一个非常适合做回归分析的数据集,波士顿房价数据集,在这一小节中,我们将使用该数据集为大家讲解SVM 中用于回归分析的SVR 的用法。 # 1、 初步了解数据集 首先还是让我们先了解一下数据集的大致情况。我们在Jupyter Notebook 中新建一个笔记本文件,输入代码如下: ``` # 导人波士顿房价数据集 from sklearn.datasets import load_boston boston = load_boston() # 打印数据集中的键 print(boston.keys()) ``` 代码运行结果: ``` dict_keys(['data', 'target', 'feature_names', 'DESCR']) ``` { 结果分析]从结果中可以看出,波士顿房价数据集中有4 个键,分别是数据、目标、特征名称和短描述。细心的读者可能发现,波士顿房价数据集比红酒数据集少了一个键,就是目标名称( target_names ) ,这是为什么呢?让我们看一下数据描述里是怎么说的。 输入代码如下: ``` # 打印数据集中的短描述 print(boston['DESCR']) ``` 运行代码,会得到较长的一段文字: ``` Boston House Prices dataset =========================== Notes ------ Data Set Characteristics: :Number of Instances: 506 :Number of Attributes: 13 numeric/categorical predictive :Median Value (attribute 14) is usually the target ......后面还有很多... ``` { 结果分析]从上面这段描述中可以看出, 数据集中共有506 个样本, 每个样本有13 个特征变量。而后面还有一个叫作中位数的第14 个变量,这个变量就是该数据集中的target 。 现在我们继续往下看数据描述: ``` :Attribute Information (in order): - CRIM per capita crime rate by town - ZN proportion of residential land zoned for lots over 25,000 sq.ft. - INDUS proportion of non-retail business acres per town - CHAS Charles River dummy variable (= 1 if tract bounds river; 0 otherwise) - NOX nitric oxides concentration (parts per 10 million) - RM average number of rooms per dwelling - AGE proportion of owner-occupied units built prior to 1940 - DIS weighted distances to five Boston employment centres - RAD index of accessibility to radial highways - TAX full-value property-tax rate per $10,000 - PTRATIO pupil-teacher ratio by town - B 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town - LSTAT % lower status of the population - MEDV Median value of owner-occupied homes in $1000's ``` [结果分析}从数据描述中,我们可以看到,原来这个变量是业主自住房屋价格的中位数,以千美元为单位。怪不得这个数据集把它作为target呢! 那么接下来我们的任务,就是通过SVR 算法,来建立一个房价预测模型。 # 2、使用SVR进行建模 接下来,我们要先制作训练数据集和测试数据集,输入代码如下: ``` # 导人波士顿房价数据集 from sklearn.datasets import load_boston boston = load_boston() # 导人数据集拆分工具 from sklearn.model_selection import train_test_split # 建立训练数据集和测试数据集 X, y = boston.data, boston.target X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8) # 打印训练集和测试集的形态 print(X_train.shape) print(X_test.shape) ``` 运行结果: ``` (379, 13) (127, 13) ``` 说明训练数据集和测试数据集我们己经准备好了,下面开始用SVR 进行建模。 我们在前面介绍了SVM 的两种核函数: “ Linear ”和“ rbf” , 不过我们不知道这两种核函数哪一个会让模型表现得更好,那么我们就分别尝试一下, 输入代码如下: ``` # 导人支持向量机回归模型 from sklearn.svm import SVR # 分别测试linear 核函数和rbf 核函数 for kernel in ['linear', 'rbf']: svr = SVR(kernel=kernel) svr.fit(X_train, y_train) print(kernel, '核函数的模型训练集得分{:.3f}'.format( svr.score(X_train, y_train))) print(kernel, ' 核函数的模型测试集得分{:.3f} '.format( svr.score(X_test, y_test))) ``` 运行结果: ``` linear 核函数的模型训练集得分0.709 linear 核函数的模型测试集得分0.696 rbf 核函数的模型训练集得分0.145 rbf 核函数的模型测试集得分0.001 ``` [结果分析] 从结果中看到, 两种核函数的模型得分都不能令人满意。使用了“ linear "核函数的模型在训练集的得分只有0.709 , 而在测试集只有0 . 696 。不过使用“ rbf” 核函数的模型更糟糕,在训练数据集的分只有0.145 , 而在测试集的得分完全可以用“ 灾难”来形容了一一居然只有0.001 分。 这是什么原因呢? 我们来思考一下, 会不会是数据集的各个特征之间的量级差的比较远呢?正如我们在上 节所说, SVM 算法对于数据预处理的要求是比较高的,如果数据特征量级差异较大, 我们就需要对数据进行预处理。所以现在我们先来用图形可视化的方法看一看数据集中各个特征的数量级是什么情况, 输入代码如下: ``` # 将每特征数值中的最小值和最大值用散点画出来 plt.plot(X.min(axis=0), 'v', label='min') plt.plot(X.max(axis=0), '^', label='max') # 设定纵坐标为对数形式 plt.yscale('log') # 设置图注位置为最佳 plt.legend(loc='best') # 设定横纵轴标题 plt.xlabel('features') plt.ylabel('feature magnitude') # 显示图形 plt.show() ``` 运行结果:  [结果分析] 从图中可以看到,在波士顿房价数据集中,各个特征的量级差异还是比较大的,第一个特征“城镇犯罪率”最小值的在$$10^{-2}$$而最大值达到了$$10^2$$(这很有可能是一个错误的数据点,犯罪率应该不会如此之高〉。而第十个特征“税收”的最小值和最大值都在10 到$$10^2$$之间。 看来为了能够让SVM 算法能够更好地对数据进行拟合,我们必须对数据集进行预处理,输入代码如下: ``` # 导人数据预处理工具 from sklearn.preprocessing import StandardScaler # 对训练集和测试集进行数据预处理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 将预处理后的数据特征最大值和最小值用散点图表示出来 plt.plot(X_train_scaled.min(axis=0), 'v', label='train set min ') plt.plot(X_train_scaled.max(axis=0), '^', label='train set max ') plt.plot(X_test_scaled.min(axis=0), 'v', label='train set min ') plt.plot(X_test_scaled.max(axis=0), '^', label='train set max ') plt.yscale('log') # 设置图注位置 plt.legend(loc='best') # 设置横纵轴标题 plt.xlabel('scaled features') plt.ylabel('scaled feature magnitude') # 显示图形 plt.show() ``` 运行结果:  [结果分析] 从图中,可以看出,经过了我们的预处理,不管是训练集还是测试集, 基本上所有的特征最大值都不会超过10 , 而最小值也都趋近于0 ,以至于在图中我们己经看不到它们了。这和我们使用的预处理的工具原理有关,在后面的章节,我们还会详细介绍数据预处理的方法。 现在我们再试试用经过预处理的数据来训练模型, 看看结果会有什么不同,输入代码如下: ``` # 导人支持向量机回归模型 from sklearn.svm import SVR # 导人数据预处理工具 from sklearn.preprocessing import StandardScaler # 对训练集和测试集进行数据预处理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 用预处理后的数据重新训练模型 for kernel in ['linear', 'rbf']: svr = SVR(kernel=kernel) svr.fit(X_train_scaled, y_train) print('数据预处理后', kernel, '核函数的模型训练集得分{:.3f}'.format( svr.score(X_train_scaled, y_train))) print('数据预处理后', kernel, ' 核函数的模型测试集得分{:.3f} '.format( svr.score(X_test_scaled, y_test))) ``` 运行结果: ``` 数据预处理后 linear 核函数的模型训练集得分0.705 数据预处理后 linear 核函数的模型测试集得分0.698 数据预处理后 rbf 核函数的模型训练集得分0.665 数据预处理后 rbf 核函数的模型测试集得分0.694 ``` [结果分析]从结果中可以看到, 经过预处理之后,“ linear ”内核的S VR 得分变化不大,而“ rbf”内核的SVR 得分有了巨大的提升。尤其是在测试集中的得分, 从0.001 分直接提升到0.694 , 己经非常接近“ linear "内核的模型了。那么如果我们进一步调整“ rbf"内核的SVR 模型参数,会不会让它的表现进一步提升呢?下面我们来实验一下。 和SVC 一样, SVR 模型也有gamma 和C 两个参数,接下来我们试着对这两个参数进行修改,输入代码如下: ``` # 导人支持向量机回归模型 from sklearn.svm import SVR # 导人数据预处理工具 from sklearn.preprocessing import StandardScaler # 对训练集和测试集进行数据预处理 scaler = StandardScaler() scaler.fit(X_train) X_train_scaled = scaler.transform(X_train) X_test_scaled = scaler.transform(X_test) # 用预处理后的数据重新训练模型 for kernel in ['linear', 'rbf']: svr = SVR(kernel=kernel,C=100,gamma=0.1) svr.fit(X_train_scaled, y_train) print('数据预处理后', kernel, '核函数的模型训练集得分{:.3f}'.format( svr.score(X_train_scaled, y_train))) print('数据预处理后', kernel, ' 核函数的模型测试集得分{:.3f} '.format( svr.score(X_test_scaled, y_test))) ``` 在这段代码中,我们令SVR 模型的参数C 等于100 ,而gamma 值等于0.1 , 运行结果: ``` 数据预处理后 linear 核函数的模型训练集得分0.706 数据预处理后 linear 核函数的模型测试集得分0.698 数据预处理后 rbf 核函数的模型训练集得分0.966 数据预处理后 rbf 核函数的模型测试集得分0.894 ``` [结果分析} 这是一个比较不错的结果,我们看到通过参数调节, “ rbf "内核的SVR 模型在训练集的得分已经高达0.966 ,而在测试数据集的得分也达到了0.894 ,可以说现在模型的表现己经是可以接受的。 # 3、小结 在本章中, 我们一起学习了支持向量机SVM 算法的基本原理,以及它的“ linear ”核函数和“ rbf "核函数,还有参数C 和gamma 的调节。最后我们使用了一个真实的数据集一一波士顿房价数据集训练了我们的SVR 模型。在这个实例中,我们一步一步地通过对数据进行预处理和对参数进行调节,使“ rbf”内核的SVR 模型在测试集中的得分从0.001 飘升到了0.894 , 通过这个案例,我们可以清晰地了解到SVM 算法对于数据预处理和调参的要求都是非常高的了。而在下一章中,我们将向大家介绍时下非常热门的算法一一神经网络。