常用的线性模型有线性回归、岭回归、套索回归、逻辑回归和线性 SVM 等。
线性回归
原理
线性回归(linear regression)是一种回归分析技术。线性回归试图学习到一个线性模型以尽可能准确地预测实值输出标记。通过在数据集上建立线性模型,建立代价函数(loss function),最终以优化代价函数为目标确定模型参数w和b,从而得到模型用以后续的预测。
具体用法
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
def linear_regression1():
# n_features: 特征个数 = n_informative() + n_redundant + n_repeated
# n_informative:多信息特征的个数
# n_redundant:冗余信息,informative特征的随机线性组合
# n_repeated :重复信息,随机提取n_informative和n_redundant 特征
# n_classes:分类类别
# n_clusters_per_class :某一个类别是由几个cluster构成的
X, y = make_regression(n_samples=200, n_features=2, n_informative=2, noise=20, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
lr = LinearRegression().fit(X_train, y_train)
print('--------------')
print('lr.coef_:{}'.format(lr.coef_[:]))
print('lr.intercept_:{}'.format(lr.intercept_))
print('----------')
print('测试数据集得分:{:.2f}'.format(lr.score(X_test, y_test)))
print('-------------')
运行结果
--------------
lr.coef_:[97.41730944 54.49354732]
lr.intercept_:-0.05991175060145615
----------
测试数据集得分:0.97
-------------
岭回归
原理
岭回归是一种能够避免过拟合的线性模型。在岭回归中,模型会保留所有的特征变量,但是会减小特征变量的系数值,让特征变量对预测结果的影响变小,在岭回归中是通过改变其 alpha 参数来控制减小特征变量系数的程度。这种通过保留全部特征变量,只是降低特征变量的系数值来避免过拟合的方法,我们称之为 L2 正则化。
具体用法
from sklearn.linear_model import Ridge
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
def linear_regression1():
# 糖尿病情数据集
X, y = load_diabetes().data, load_diabetes().target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
# alpha 越大,则越降低过拟合程度
ridge = Ridge(alpha=0.5).fit(X_train, y_train)
print('--------------')
print('ridge.coef_:{}'.format(ridge.coef_[:]))
print('ridge.intercept_:{}'.format(ridge.intercept_))
print('----------')
print('训练数据集得分:{:.2f}'.format(ridge.score(X_train, y_train)))
print('测试数据集得分:{:.2f}'.format(ridge.score(X_test, y_test)))
运行结果
--------------
ridge.coef_:[ 34.51271596 -128.2391615 367.7570263 266.8969371 -27.64762407
-57.6591586 -162.73744155 105.62127781 281.34740313 125.36349347]
ridge.intercept_:152.514304568997
----------
训练数据集得分:0.48
测试数据集得分:0.47
套索回归
原理
套索回归也会将系数限制在非常接近 0 的范围内,但它进行限制的方式稍微有点不同,我们称之为 L1 正则化。L1 正则化会导致在使用套索回归的时候,有一部分特征的系数会正好等于 0 。也就是说,有一些特征在使用套索回归的时候会彻底被模型忽略掉,这也可以看成是模型对于特征进行自动选择的一种方式。把一些特征忽略掉,从而突出体现模型中最重要的那些特征。
具体用法
from sklearn.linear_model import Lasso
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
import numpy as np
def linear_regression1():
# 糖尿病情数据集
X, y = load_diabetes().data, load_diabetes().target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
# alpha 越大,则使用特征数越少
lasso = Lasso(alpha=0.1, max_iter=100000).fit(X_train, y_train)
print('--------------')
print('lasso.coef_:{}'.format(lasso.coef_[:]))
print('lasso.intercept_:{}'.format(lasso.intercept_))
print('----------')
print('训练数据集得分:{:.2f}'.format(lasso.score(X_train, y_train)))
print('测试数据集得分:{:.2f}'.format(lasso.score(X_test, y_test)))
print('套索回归使用的特征数:{}'.format(np.sum(lasso.coef_ != 0)))
运行结果
--------------
lasso.coef_:[ 0. -181.40911617 537.71961152 355.19720303 -105.43471481
-0. -198.99829878 0. 440.25133426 48.25573121]
lasso.intercept_:152.43690667906043
----------
训练数据集得分:0.52
测试数据集得分:0.48
套索回归使用的特征数:7
弹性网模型
原理
弹性网模型(ElasticNet)综合了岭回归和套索回归的惩罚因子。在实践中这个模型的效果是做好的,然而代价是用户需要调整量两个参数,一个是 L1 正则化参数,另一个是 L2 正则化参数。
具体用法
from sklearn.linear_model import ElasticNet
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
import numpy as np
def linear_regression1():
# 糖尿病情数据集
X, y = load_diabetes().data, load_diabetes().target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=8)
elastic_net = ElasticNet(alpha=1, l1_ratio=1, max_iter=100000).fit(X_train, y_train)
print('--------------')
print('elastic_net.coef_:{}'.format(elastic_net.coef_[:]))
print('elastic_net.intercept_:{}'.format(elastic_net.intercept_))
print('----------')
print('训练数据集得分:{:.2f}'.format(elastic_net.score(X_train, y_train)))
print('测试数据集得分:{:.2f}'.format(elastic_net.score(X_test, y_test)))
print('弹性网回归使用的特征数:{}'.format(np.sum(elastic_net.coef_ != 0)))
运行结果
--------------
elastic_net.coef_:[ 0. -0. 384.73421807 72.69325545 0.
0. -0. 0. 247.88881314 0. ]
elastic_net.intercept_:152.6882498532522
----------
训练数据集得分:0.36
测试数据集得分:0.37
弹性网回归使用的特征数:3