sklearn机器学习算法--线性模型

线性模型

  • 用于回归的线性模型
  • 线性回归(普通最小二乘法)
  • 岭回归
  • lasso
  • 用于分类的线性模型
  • 用于多分类的线性模型

1、线性回归

LinearRegression,模型简单,不同调节参数

#2、导入线性回归模型
from sklearn.linear_model import LinearRegression
#3、实例化线性回归模型对象
lr = LinearRegression()
#4、对训练集进行训练
lr.fit(X_train,y_train)
#“斜率”参数(w,也叫作权重或系数)被保存在coef_ 属性中,而偏移或截距(b)被保存在intercept_ 属性中:
print('lr.coef_:{}'.format(lr.coef_))
print('lr.intercept_:{}'.format(lr.intercept_))
View Code

 

2、岭回归

Ridge,调节参数alpha,默认使用L2正则化,alpha越大模型得到的系数就更接近于0,减少alpha可以让系数受到的约束减小。

#导入岭回归模型
from sklearn.linear_model import Ridge
#实例化岭回归模型对象并对训练集进行训练
ridge = Ridge().fit(X_train,y_train)
#查看模型在训练集和测试集上的精确度
print('training score:{}'.format(ridge.score(X_train,y_train)))
print('testing score:{}'.format(ridge.score(X_test,y_test)))
#在实例化Ridge模型中存在参数alpha,alpha越大模型得到的系数就更接近于0,减少alpha可以让系数受到的约束减小。
#比较alpha=0.1,1,10和LinearRegression系数大小
ridge10 = Ridge(alpha=10).fit(X_train, y_train)
ridge01 = Ridge(alpha=0.1).fit(X_train, y_train)
View Code

 

 

 3、Lasso

除了Ridge,还有一种正则化的线性回归是Lasso。与岭回归相同,使用lasso 也是约束系数使其接近于0,但用到的方法不同,叫作L1 正则化。8 L1 正则化的结果是,使用lasso 时某些系数刚好为0。这说明某些特征被模型完全忽略。这可以看作是一种自动化的特征选择。某些系数刚好为0,这样模型更容易解释,也可以呈现模型最重要的特征。

#导入模型
from sklearn.linear_model import Lasso
#实例化模型对象并对训练集进行训练
lasso = Lasso().fit(X_train,y_train)
#查看lasso模型在训练集和测试集上的精度
print('training score:{}'.format(lasso.score(X_train,y_train)))
print('test score:{}'.format(lasso.score(X_test,y_test)))
print('coef number:{}'.format(np.sum(lasso.coef_!=0)))
#发现模型只用到了105 个特征中的4 个。与Ridge 类似,Lasso 也有一个正则化参数alpha,可以控制系数趋向于0 的强度。在上一个例子中,我们用的是默认值alpha=1.0。为了降低欠拟合,我们尝试减小alpha。这么做的同时,我们还需要增加max_iter 的值(运行迭代的最大次数)
View Code

4、用于分类的线性模型

最常见的两种线性分类算法是Logistic回归和线性支持向量机(SVM)

#导入Logistic和LinearSVC模型
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
#导入forge数据
X,y = mglearn.datasets.make_forge()
#比较两种模型得到的决策边界
fig,axes = plt.subplots(1,2,figsize = (10,3))
for model,ax in zip([LogisticRegression(),LinearSVC()],axes):
    clf = model.fit(X,y)
    mglearn.plots.plot_2d_separator(clf,X,ax=ax)
    mglearn.discrete_scatter(X[:,0],X[:,1],y,ax=ax)
    ax.set_title(clf.__class__.__name__)
    ax.set_xlabel('Feature 0')
    ax.set_ylabel('Feature 1')
View Code

 

两个模型得到了相似的决策边界。注意,两个模型中都有两个点的分类是错误的。两个模型都默认使用L2 正则化,就像Ridge 对回归所做的那样。对于LogisticRegression 和LinearSVC, 决定正则化强度的权衡参数叫作C。C 值越大,对应的正则化越弱。换句话说,如果参数C 值较大,那么LogisticRegression 和LinearSVC 将尽可能将训练集拟合到最好,而如果C 值较小,那么模型更强调使系数向量(w)接近于0。参数C 的作用还有另一个有趣之处。较小的C 值可以让算法尽量适应“大多数”数据点,而较大的C 值更强调每个数据点都分类正确的重要性。

5、用于多分类线性模型

将二分类算法推广到多分类算法的一种常见方法是“一对其余”(one-vs.-rest)方法。在“一对其余”方法中,对每个类别都学习一个二分类模型,将这个类别与所有其他类别尽量分开,这样就生成了与类别个数一样多的二分类模型。在测试点上运行所有二类分类器来进行预测。在对应类别上分数最高的分类器“胜出”,将这个类别标签返回作为预测结果。

#使用正态分布数据演示Logistic多分类模型
#导入高斯分布数据
from sklearn.datasets import make_blobs
X,y = make_blobs(random_state=42)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.legend(["Class 0", "Class 1", "Class 2"])
line_svc = LinearSVC().fit(X,y)
mglearn.discrete_scatter(X[:,0],X[:,1],y)
line = np.linspace(-15,15)
for coef, intercept, color in zip(line_svc.coef_,line_svc.intercept_,['b','r','g']):
    plt.plot(line,-(line*coef[0]+intercept)/coef[1],c=color)
View Code

总结

在实践中,在Ridge和Lasso两个模型中一般首选岭回归。但如果特征很多,你认为只有其中几个是重要的,那么选择Lasso 可能更好。同样,如果你想要一个容易解释的模型,Lasso 可以给出更容易理解的模型,因为它只选择了一部分输入特征。scikit-learn 还提供了ElasticNet类,结合了Lasso 和Ridge 的惩罚项。在实践中,这种结合的效果最好,不过代价是要调
节两个参数:一个用于L1 正则化,一个用于L2 正则化。线性模型的主要参数是正则化参数,在回归模型中叫作alpha,在LinearSVC 和Logistic-Regression 中叫作C。alpha 值较大或C 值较小,说明模型比较简单。特别是对于回归模型而言,调节这些参数非常重要。通常在对数尺度上对C 和alpha 进行搜索。你还需要确定的是用L1 正则化还是L2 正则化。如果你假定只有几个特征是真正重要的,那么你应该用L1 正则化,否则应默认使用L2 正则化。如果模型的可解释性很重要的话,使用L1 也会有帮助。由于L1 只用到几个特征,所以更容易解释哪些特征对模型是重要的,以及这些特征的作用。

posted @ 2019-12-10 16:59  雪小西  阅读(562)  评论(0编辑  收藏  举报