sklearn--回归
一.线性回归
LinearRegression类就是我们平时所说的普通线性回归,它的损失函数如下所示:
对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit-learn中的LinearRegression类使用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θ为:
验证方法:LinearRegression类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,然后进行训练优化。
使用场景:一般来说,只要我们觉得数据有线性关系,LinearRegression类就是我们的首选。如果发现拟合或者预测的不好,再考虑用其它线性回归类库。
from sklearn.linear_model import LinearRegression lr=LinearRegression() lr.fit(train_x,train_y) print lr.intercept_ print lr.coef_
二.岭回归
由于LinearRegression没有考虑过拟合的问题,有可能导致泛化能力较差,这时损失函数可以加入正则化项,如果加入的是L2范数的正则化项,就是Ridge回归的损失函数,如下所示:
Ridge回归在不抛弃任何一个特征的情况下,缩小了回归系数(是一种缩放的模型),使得模型相对而言比较稳定,不至于过拟合。
对于这个损失函数,一般有梯度下降法和最小二乘法两种极小化损失函数的优化方法,而scikit-learn中的Ridge类使用的是最小二乘法。通过最小二乘法,可以解出线性回归系数θ为:
验证方法:Ridge类并没有用到交叉验证之类的验证方法,需要我们自己把数据集分成训练集和测试集,需要自己设置好超参数α,然后进行训练优化。
使用场景:一般来说,只要我们觉得数据有线性关系,并且使用LinearRegression类拟合的不是特别好,需要正则化时,可以考虑用Ridge类。但是这个类最大的缺点是每次我们要自己指定一个超参数α,然后自己评估α的好坏,比较麻烦,一般都会使用下面将会讲到的RidgeCV类来跑Ridge回归,不推荐直接用这个Ridge类,除非你只是为了学习Ridge回归。
from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score alphas=np.logspace(-3,2,50) test_scores =[] for alpha in alphas: clf=Ridge(alpha) test_score=np.sqrt(-cross_val_score(clf,X_train,Y_train,cv=10,scoring='neg_mean_squared_error')) test_scores.append(np.mean(test_score)) plt.plot(alphas,test_scores)
RidgeCV类的损失函数和损失函数的优化方法与Ridge类完全相同,区别在于验证方法。
验证方法:RidgeCV类对超参数α使用了交叉验证,来帮助我们选择一个合适的α值。在初始化RidgeCV类时,我们可以提供一组备选的α值。RidgeCV类会帮我们选择一个合适的α值,免去了我们自己去一轮轮筛选α值的苦恼。
from sklearn.linear_model import RidgeCV # 在初始化RidgeCV类时, 提供一组备选的α值, RidgeCV类会帮我们选择一个合适的α值. ridgecv = RidgeCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5) # 拟合训练集 ridgecv.fit(train_X, train_Y) # 打印最优的α值 print "最优的alpha值: ", ridgecv.alpha_ # 打印模型的系数 print ridgecv.intercept_ print ridgecv.coef_
三.lasso回归
线性回归的L1正则化通常称为Lasso回归,它和Ridge回归的区别是在损失函数上增加的是L1正则化项,而不是L2正则化项。L1正则化项也有一个常数系数α来调节损失函数的均方差项和正则化项的权重,具体的Lasso回归的损失函数如下所示:
Lasso回归可以使得一些特征的系数变小,甚至一些绝对值非常小的系数直接变为0,增强模型的泛化能力。
Lasso回归的损失函数的优化方法常用的有两种,分别是坐标轴下降法和最小角回归法。Lasso类采用的是坐标轴下降法,后面讲到的LassoLars类采用的是最小角回归法
from sklearn.linear_model import LassoCV # 在初始化LassoCV类时, 提供一组备选的α值, LassoCV类会帮我们选择一个合适的α值. lassocv = LassoCV(alphas=[0.01, 0.1, 0.5, 1, 3, 5, 7, 10, 20, 100], cv=5) # 拟合训练集 lassocv.fit(train_X, train_Y.values.ravel()) # 打印最优的α值 print "最优的alpha值: ", lassocv.alpha_ # 打印模型的系数 print lassocv.intercept_ print lassocv.coef_
三.多项式回归
当我们拟合的是一个曲线的时候我们就不能只考虑线性拟合了,我们可以考虑多项式拟合,通过加入高次的特征来来得到总的特征样本,然后在进行线性的拟合
#多项式拟合 from sklearn.preprocessing import PolynomialFeatures poly_features = PolynomialFeatures(degree=5, include_bias=False)#其中的degree就是指的最高次项的个数 X_poly = poly_features.fit_transform(X) print(X_poly.shape) lin_reg = LinearRegression() lin_reg.fit(X_poly, y) print(lin_reg.intercept_, lin_reg.coef_)
四.逻辑回归
逻辑回归之所以被分为线性回归的一种,只因为其本质也是线性回归,只不过得到的线性相加求和之后加上了sigmod函数将其二值化
from sklearn.linear_model import LogiticRegression lr==Logiticregression() lr.fit(x,y)