一、导入模块
%matplotlib inline #将生成的图片嵌入网页中
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.feature_selection import SelectKBest,f_regression
from sklearn.linear_model import LinearRegression #导入先行回归模型
from sklearn.svm import SVR #导入svm模型
from sklearn.ensemble import RandomForestRegressor #导入随机森林模型
我们用到的模块有matplotlib可视化,还有sklearn机器学习模块,其中也用到了LinearRegression线性回归模型、SVM(支持向量机)回归模型和RandomForestRegressor随机森林模型。
线性回归:,线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。
支持向量机:支持向量机(SVM,还支持矢量网络)是与相关的学习算法有关的监督学习模型,可以分析数据,识别模式,用于分类和回归分析。给定一组训练样本,每个标记为属于两类,一个SVM训练算法建立了一个模型,分配新的实例为一类或其他类,使其成为非概率二元线性分类。
随机森林:随机森林是一种多功能的机器学习算法,能够执行回归和分类的任务。同时,它也是一种数据降维手段,用于处理缺失值、异常值以及其他数据探索中的重要步骤,并取得了不错的成效。
二、加载数据
boston_data = datasets.load_boston()
x_full = boston_data.data #加载load_boston()中所有数据,一共有506条记录,13条特征(变量)
y = boston_data.target #加载load_boston()中的目标值,即标签
print(x_full.shape)
print(y.shape)
#输出:
(506, 13)
(506,)
我们加载机器学习模块sklearn中自带的数据load_boston()波士顿房价数据。这一步也可以对数据进行初步的分析,.data加载数据中的所有记录,.target查看数据中的目标值,即标签。然后用.shape查看所有记录和目标值的维度,可以看到一共有506条记录,13条特征,也就是有506条目标值,在这里目标值指的是房价。
三、转换和分析
selector = SelectKBest(f_regression,k=1) #选出相关性最强的SelectKBest类作为特征
selector.fit(x,y) #采用fit()方法进行数据拟合
x = x_full[:,selector.get_support()] #采用get_support()将数据缩减成一个向量,即数据降维
print(x.shape)
#输出:
(506, 1)
在这一步,我们用SelectKBest类选出相关性最强的一个特征,也就是一个向量。采用fit()方法将数据拟合,然后用get_support()将数据缩减成一个向量,即数据降维。
四、可视化
def plot_scatter(x,y,R=None):
plt.scatter(x,y,s=32,marker='o',facecolors='blue')
if R is not None:
plt.scatter(x,R,color='red',linewidth=0.5)
plt.show()
plot_scatter(x,y)
由于目标是一个向量,所以我们可以看看输入(特征)和输出(房价)之间是都存在线性关系。
根据输出的结果,我们可以看到随着x的增加,y在减少,但是这种变化比率不是恒定的。这是一个非线性情况,我们可以利用一个回归模型进一步将它可视化。
五、模型分析
#线性回归模型
regressor = LinearRegression(normalize=True).fit(x,y)
plot_scatter(x,y,regressor.predict(x))
这一步,我们创建并训练了一个线性回归模型,红色画出了输入和输出之间的最佳线性关系。很显然我们看到这个效果并不是很好,它只是一个近似值。
接下来我们看看支持向量机和随机森林的模型效果。
#SVM回归模型
regressor = SVR().fit(x,y)
plot_scatter(x,y,regressor.predict(x))
支持向量机是一种用来解决非线性问题的模型,可以看到在这种情况下,支持向量机的效果比线性回归的效果更好一点。
最后再看看随机森林。
#随机森林回归模型
regressor =RandomForestRegressor().fit(x,y)
plot_scatter(x,y,regressor.predict(x))
我们看到这种情况下利用随机森林的效果比前面两个好多了,随机森林是一种四栋解决非线性问题的模型。