回归模型中线性回归是最最基本的模型,也是在数据处理中运用最多的模型。sklearn提供了一套完备的工具集,可以对数据进行拟合和预测。
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression,RidgeCV,LassoCV,ElaticNetCV
from sklearn.preprocessing.PolynomialFeatures import PolynomialFeatures
models = [Pipeline([
('poly', PolynomialFeatures()),
('linear', LinearRegression(fit_intercept=False))]),
Pipeline([
('poly', PolynomialFeatures()),
('linear', RidgeCV(alphas=np.logspace(-3, 2, 50), fit_intercept=False))]),
Pipeline([
('poly', PolynomialFeatures()),
('linear', LassoCV(alphas=np.logspace(-3, 2, 50), fit_intercept=False))]),
Pipeline([
('poly', PolynomialFeatures()),
('linear', ElasticNetCV(alphas=np.logspace(-3, 2, 50), l1_ratio=[.1, .5, .7, .9, .95, .99, 1],
fit_intercept=False))])
]
模型中的fit_intercept代表是否存在截距,默认是开启的,normalize:标准化开关,默认关闭。
通过上面的头文件就可以看出来除了提供最最基本的LinearRegression以外,还提供带有L1 L2范数的LassoCV和RidgeCV。
LinearRegression的损失函数为J(θ)=1/2(Xθ−Y)T(Xθ−Y) 。优化方法为梯度下降和最小二乘法,scikit中采用最小二乘
。只要数据线性相关,LinearRegression就是首选,如果发现拟合或者预测的不够好,再考虑其他的线性回归库。
LassoCV的损失函数为J(θ)=1/2m(Xθ−Y)T(Xθ−Y)+α||θ|| 。即 线性回归LineaRegression的损失函数+L1(1范式的正则化项α||θ||) ,Lasso回归可以使得一些特征的系数变小,甚至还使一些绝对值较小的系数直接变为0,从而增强模型的泛化能力,因此对于高维的特征数据,尤其是线性关系是稀疏的,就采用Lasso回归,或者是要在一堆特征里面找出主要的特征。
RidgeCV的损失函数为J(θ)=1/2(Xθ−Y)T(Xθ−Y)+1/2(α||θ||^2)。即线性回归LineaRegression的损失函数+L2(2范式的正则化项1/2(α||θ||^2))),其中a为超参数 alphas=np.logspace(-3, 2, 50) 从给定的超参数a中选择一个最优的,logspace用于创建等比数列 本例中 开始点为10的-3次幂,结束点10的2次幂,元素个数为50.并且从这50个数中选择一个最优的超参数。Ridge回归中超参数a和回归系数θ的关系,a越大,正则项惩罚的就越厉害,得到的回归系数θ就越小,最终趋近与0。如果a越小,即正则化项越小,那么回归系数θ就越来越接近于普通的线性回归系数。
#使用场景:只要数据线性相关,用LinearRegression拟合的不是很好,需要正则化,可以考虑使用RidgeCV回归。
ElaticNetCV的损失函数为J(θ)=1/2m(Xθ−Y)T(Xθ−Y)+αρ||θ||1+α(1−ρ)/2||θ||22 其中α为正则化超参数,ρ为范数权重超参数 。乍一看就是Lasso和Ridge损失函数的合体。其中alphas=np.logspace(-3, 2, 50), l1_ratio=[.1, .5, .7, .9, .95, .99, 1] 。ElasticNetCV会从中选出最优的 a和p 。ElasticNetCV类对超参数a和p使用交叉验证,帮助选择合适的a和p,使用场景:ElasticNetCV类在我们发现用Lasso回归太过(太多特征被稀疏为0),而Ridge回归也正则化的不够(回归系数衰减太慢)的时候。
所以综上排名:LinearRegression > LassoCV(稀疏) > ElaticNetCV > RidgeCV(稠密)
model = models[t]
model.set_params(poly__degree=d) #设置多项式回归的阶
model.fit(x, y.ravel())
lin = model.get_params('linear')['linear']
if hasattr(lin, 'alpha_'):
...
if hasattr(lin, 'l1_ratio_'): # 根据交叉验证结果,从输入l1_ratio(list)中选择的最优l1_ratio_(float)
...
print output, lin.coef_.ravel(),lin.intercept_
y_hat = model.predict(x_hat)
s = model.score(x, y)
sklearn中提供了pipeline,只要把模型定义好,就可以直接利用fit对数据进行拟合,拟合完毕后使用predict进行预测。其中通过get_params可以获取某个模型,然后就能访问该回归模型的coef_和intercept_ ,如果模型设置的fit_intercept=false,那么打印出的lin.coef_中第一项就是截距,后面的为各个相关系数,lin.intercept_为0。如果置为true,那么lin.intercept_为截距值。
model.score主要用来衡量模型的拟合程度,Returns the coefficient of determination R^2 of the prediction.
R^2就是1-RSS/TSS,R^2越大,拟合效果越好。如果预测值为样本期望,那么R^2为0。
附sklearn工具类
包 |
类 |
参数列表 |
类别 |
fit方法有用 |
说明 |
sklearn.preprocessing |
StandardScaler |
特征 |
无监督 |
Y |
标准化 |
sklearn.preprocessing |
MinMaxScaler |
特征 |
无监督 |
Y |
区间缩放 |
sklearn.preprocessing |
Normalizer |
特征 |
无信息 |
N |
归一化 |
sklearn.preprocessing |
Binarizer |
特征 |
无信息 |
N |
定量特征二值化 |
sklearn.preprocessing |
OneHotEncoder |
特征 |
无监督 |
Y |
定性特征编码 |
sklearn.preprocessing |
Imputer |
特征 |
无监督 |
Y |
缺失值计算 |
sklearn.preprocessing |
PolynomialFeatures |
特征 |
无信息 |
N |
多项式变换(fit方法仅仅生成了多项式的表达式) |
sklearn.preprocessing |
FunctionTransformer |
特征 |
无信息 |
N |
自定义函数变换(自定义函数在transform方法中调用) |
sklearn.feature_selection |
VarianceThreshold |
特征 |
无监督 |
Y |
方差选择法 |
sklearn.feature_selection |
SelectKBest |
特征/特征+目标值 |
无监督/有监督 |
Y |
自定义特征评分选择法 |
sklearn.feature_selection |
SelectKBest+chi2 |
特征+目标值 |
有监督 |
Y |
卡方检验选择法 |
sklearn.feature_selection |
RFE |
特征+目标值 |
有监督 |
Y |
递归特征消除法 |
sklearn.feature_selection |
SelectFromModel |
特征+目标值 |
有监督 |
Y |
自定义模型训练选择法 |
sklearn.decomposition |
PCA |
特征 |
无监督 |
Y |
PCA降维 |
sklearn.lda |
LDA |
特征+目标值 |
有监督 |
Y |
LDA降维 |
参考
http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.RidgeCV.html