线性回归模型的sklearn实现

关于线性回归模型的知识总结,请参见这里。此处主要介绍线性模型的相关算法在sklearn中的实现:

一、线性回归(最小二乘法)

from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.make_wave(n_samples=60)#导入数据
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

lr = LinearRegression().fit(X_train, y_train)#拟合模型

print("lr.coef_: {}".format(lr.coef_))#输出系数(斜率)
print("lr.intercept_: {}".format(lr.intercept_))#输出截距(偏移量)

#准确率(模型效果)
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))

#用训练好的模型求新数据的值
lr.predict(X_test)

二、岭回归

岭回归也是一种用于回归的线性模型,它要求系数w的所有元素都接近0(直观来看,既要求每个特征对输入的影响尽可能小,还要给出很好的预测结果)。这种约束就是所谓正则化的一个例子,正则化是指对模型做显式约束,以避免过拟合。岭回归用L2正则化。

from sklearn.linear_model import Ridge

X, y = mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

ridge = Ridge().fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge.score(X_test, y_test)))

Ridge模型在模型的简单性(系数都接近于0)与训练集性能之间做出权衡。简单性和训练集性能二者对于模型的重要程度可以由用户通过设置alpha参数来指定。alpha默认值为1,其最佳设定取决于具体的数据集。增大alpha会使得系数更趋于0,从而降低训练集性能,但可能提高泛化性能。(alpha=0相当于线性回归)

ridge10 = Ridge(alpha=10).fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge10.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge10.score(X_test, y_test)))

由于岭回归是正则化的,因此它的训练效果要弱于线性回归。但如果有足够多的数据,正则化变得不那么重要,并且岭回归和线性回归具有相同的性能(增加训练集的大小,会提高线性回归的效果,弱化岭回归所其的正则化作用)。

三、lass回归

除了lasso外,还有一种正则化的线性回归是lasso。与岭回归相同,使用lasso也是约束系数使其接近于0,但使用的是L1正则化。L1正则化的结果是,使用lasso回归时某些系数刚好为0,这说明某些特征被模型完全忽略,这可以看成是一种自动化的特征选择,呈现出模型某些最重要的特征。

from sklearn.linear_model import Lasso

lasso = Lasso().fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso.coef_ != 0)))

lasso中也有一个参数alpha,可以控制系数趋于0的强度。为了降低欠拟合,可以减小alpha,增加max_iter的值(最大迭代次数),但alpha取得太小时会出现过拟合,会消除正则化作用。一般情况下,alpha越大,权重系数中为0的元素越多,其他元素的值也越小,正则化作用强,但会出现欠拟合。

lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(X_train, y_train)
print("Training set score: {:.2f}".format(lasso00001.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lasso00001.score(X_test, y_test)))
print("Number of features used: {}".format(np.sum(lasso00001.coef_ != 0)))

在实践中,两个模型中一般首选岭回归。但如果特征很多,你认为只有其中几个是重要的,那么选择lasso可能更好,它也能给出更容易解释的模型,因为它只选择了一部分输入特征。

四、用于二分类的线性模型

对于二分类来说,用下面的公式进行预测:

                                                        y=w[0]*x[0]+w[1]*x[1]+...+w[p]*x[p]+b

设置一个阈值,如果函数值大于阈值,就预测为类别+1,如果函数值小于阈值,就预测为类别-1.对于所有用于分类的线性模型,这个规则都是通用的。同样,有很多方法来找出系数(w)和截距(b)。二元线性分类器是利用直线,平面或超平面来分开两个类别的分类器。最常见的两种线性分类算法是Logistic回归和线性支持向量机(线性SVM)。

from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC

from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    cancer.data, cancer.target, stratify=cancer.target, random_state=42)
logreg = LogisticRegression().fit(X_train, y_train)
print("Training set score: {:.3f}".format(logreg.score(X_train, y_train)))
print("Test set score: {:.3f}".format(logreg.score(X_test, y_test)))

对于LogisticRegression和LinearSVC决定正则化强度的权衡参数叫C(默认值为1。C越大,对应的正则化越弱,非零系数越多,值相对也较大),决定正则化类型的参数叫做penalty(默认值为”l2“)。

lr_l1 = LogisticRegression(C=0.1, penalty="l1").fit(X_train, y_train)

参数C还有一个有趣之处,较小的C值可以让算法尽量适应”大多数“数据点(正则化作用强,降低训练集精度,提高泛化能力),而较大的C值则更强调每个数据点都分类正确的重要性(训练集精度高)。

五、用于多分类的线性模型

许多线性分类模型只适用于二分类问题,不能轻易推广到多类别问题(Logisitic除外)。将二分类算法推广到多分类算法的一种常见方法是”一对其余“。首先,在训练集中选定一个类别的样本,将不属于该类的样本都划分到”其余“这个类别中,此时就变成了一个二分类问题(当前类和其余类),可以训练一个二分类模型;然后,依次选择每个类别的样本,施以相同的操作,这样就生成了和样本类别数目相同的二分类模型;最后,在测试集上进行预测,对应类别上分数最高的分类器”胜出“,将这个类别的标签返回作为预测结果。

每个类别都对应一个二分类器,这样每个类别也都有一个系数向量(w)和一个截距(b)。下面给出的是分类置信方程,其结果中最大值对应的类别即为预测的类别标签: 

                                                         y=w[0]*x[0]+w[1]*x[1]+...+w[p]*x[p]+b

多分类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"])

                                                              线性回归模型的sklearn实现_第1张图片 

linear_svm = LinearSVC().fit(X, y)
print("Coefficient shape: ", linear_svm.coef_.shape)
print("Intercept shape: ", linear_svm.intercept_.shape)

 

mglearn.discrete_scatter(X[:, 0], X[:, 1], y)
line = np.linspace(-15, 15)
for coef, intercept, color in zip(linear_svm.coef_, linear_svm.intercept_,
                                  mglearn.cm3.colors):
    plt.plot(line, -(line * coef[0] + intercept) / coef[1], c=color)
plt.ylim(-10, 15)
plt.xlim(-10, 8)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
plt.legend(['Class 0', 'Class 1', 'Class 2', 'Line class 0', 'Line class 1',
            'Line class 2'], loc=(1.01, 0.3))

                                                线性回归模型的sklearn实现_第2张图片

另外,关于sklearn中的代码实现,比较常用的例子如下:

# instantiate model and fit it in one line
logreg = LogisticRegression().fit(X_train, y_train)

logreg = LogisticRegression()
y_pred = logreg.fit(X_train, y_train).predict(X_test)

y_pred = LogisticRegression().fit(X_train, y_train).predict(X_test)

 

你可能感兴趣的:(sklearn,机器学习)