前言
本栏目主要介绍机器学习中的算法模型,具体包含算法推导
、应用场景
、代码实现
以及模型优缺点
这几个模块。本文先介绍机器学习中最简单的一个算法模型——线性回归。
一、算法推导
李航老师的《统计学习方法》中提到,统计学习方法都是由模型
、策略
和算法
构成的,因此本文在算法推导也主要从这三部分进行展开讨论。
1.模型
模型通俗来说就是最后要得到一个什么样的方程。线性回归的模型如下:
f
(
x
)
=
w
0
T
x
+
b
=
w
T
x
f(x) = w_{0}^Tx + b=w^Tx
f(x)=w0Tx+b=wTx
其中在训练阶段
f
(
x
)
和
x
f(x)和x
f(x)和x都是已知的,
w
和
b
w和b
w和b是需要估计的参数。
2.策略
有了模型,接下来就需要考虑按照什么样准则学习或选择最优的模型。选择最优模型的原则一般是最小化损失函数,所以策略其实是给出损失函数。线性回归的损失函数一般采用平方损失函数:
J
(
w
)
=
1
m
∑
i
=
1
m
(
f
(
x
i
)
−
y
i
)
2
=
1
m
∑
i
=
1
m
(
w
T
x
i
−
y
i
)
2
J(w)=\frac{1}{m} \sum_{i=1}^{m}\left(f\left(\boldsymbol{x}_{i}\right)-y_{i}\right)^{2}=\frac{1}{m} \sum_{i=1}^{m}\left(w^Tx_{i}-y_{i}\right)^{2}
J(w)=m1i=1∑m(f(xi)−yi)2=m1i=1∑m(wTxi−yi)2
其中
f
(
x
i
)
f(x_{i})
f(xi)是模型的预测值,
y
i
y_{i}
yi是真实值。
3.算法
算法部分就是通过最小化Loss来求出参数
w
w
w,求最小值的方法有很多,最常用的是通过梯度下降迭代求得最小值。但是对于线性回归的损失函数,我们有更简单的方式:
J
(
w
)
J(w)
J(w)直接对
w
w
w求导,令其导数等于0。
∂
J
(
w
)
∂
w
=
0
\frac{\partial J(w)}{\partial w}=0
∂w∂J(w)=0
得到:
X
T
X
w
=
X
y
X^{T} X w=X y
XTXw=Xy
其中
X
X
X是样本矩阵,求得
w
的
最
优
解
w的最优解
w的最优解
w
∗
=
(
X
T
X
)
−
1
X
T
y
w^{*}=\left(X^{T} X\right)^{-1} X^{T} y
w∗=(XTX)−1XTy
将
w
∗
w^*
w∗代入模型中即可得到最终方程。
二、应用场景
线性回归由于比较简单,可解释性强,因此在经济学这种重解释的领域应用的比较多,绝大部分的计量方法都是基于线性回归的。平时生活的一些比较简单的相关关系也可以使用线性回归来进行预测。
三、代码实现
这里主要使用sklearn这个库来实现机器学习算法。
1.导入相关库
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.datasets import fetch_california_housing
from sklearn.metrics import mean_squared_error
import pandas as pd
import numpy as np
2.读取样例数据
data = fetch_california_housing() # 获取样例数据,这里的数据是加利福利亚的放假数据
X = pd.DataFrame(data.data,columns=data.feature_names)
y = data.target
"""
MedInc:该街区住户的收入中位数
HouseAge:该街区房屋使用年代的中位数
AveRooms:该街区平均的房间数目
AveBedrms:该街区平均的卧室数目
Population:街区人口
AveOccup:平均入住率
Latitude:街区的纬度
Longitude:街区的经度
"""
3.划分训练集和测试集
X_train, X_test, y_train, y_test =train_test_split(X,y,test_size=0.3,random_state=0)
4.建立模型
model = LinearRegression().fit(X_train,y_train)
y_pred = model.predict(X_test)
最终模型参数
5.评估模型
计算均方误差MSE
print('MSE:%.3f'%(mean_squared_error(y_test,y_pred)))
MSE:0.543
其实上面用的方法是留出法,我们也可以使用交叉验证法来计算模型误差。这样就把划分训练集和测试集、建立模型以及评估模型这几步合并在一起。
mse = -np.mean(cross_val_score(LinearRegression(),X,y,cv=10,scoring='neg_mean_squared_error'))
print('MSE:%.3f'%(mse))
MSE:0.551
可以看到两者比较接近。
四、优缺点
1.优点
(1)可解释性强,可以清晰的知道每个特征对模型的影响
(2)简单快速
2.缺点
(1)只适用于数据之间的线性关系,但现实生活中大多数特征之间的关系是非线性的。
(2)需要满足一些假设,特征之间不能存在共线性