将系数向量分配回scikit中的要素学习Lasso

时间:2015-04-24 16:01:21

标签: python numpy pandas scikit-learn

我正在scikit中运行一个Lasso来学习数据集。以下是我的设计矩阵(X)的样子:

    Year    Country SW  NY.GDP.DEFL.KD.ZG.1 NY.GDP.PCAP.KD.ZG   NY.GDP.DEFL.KD.ZG   NE.IMP.GNFS.ZS  NY.GDP.DISC.CN  FS.AST.PRVT.GD.ZS   FS.AST.DOMS.GD.ZS   NY.GDS.TOTL.ZS  NY.GDP.DISC.KN  NY.GDP.NGAS.RT.ZS   NY.GDP.PETR.RT.ZS   NY.GDP.COAL.RT.ZS   NY.GDP.MINR.RT.ZS   NY.GDP.TOTL.RT.ZS   MS.MIL.XPND.GD.ZS
0   0   0   1   -3576217.383052 -5146876.546040 -3471506.772186 -2633821.885258 -3.680928e+06   91.575314   99.278420   -5670429.600369 -3.785639e+06   -4832744.713442 -5461008.378638 -3366796.16132  -3995059.826515 -5565718.989504 -1691426.387465
1   1   0   1   5.713486    0.563529    4.713486    21.969161   -5.000000e+06   88.625556   92.244479   23.625253   1.309500e+10    1.089173    0.983267    0.00000 1.471053    3.860570    2.057921
2   2   0   1   3.559686    2.640931    2.559686    21.466621   -1.000000e+06   87.785550   93.413707   24.273287   1.558700e+10    1.014641    1.021970    0.00000 1.371797    3.681716    1.925137
3   3   0   1   1.337874    3.811404    0.337874    20.646004   1.000000e+06    84.262083   91.313310   23.840716   1.962200e+10    0.445549    0.412880    0.00000 1.079369    2.178213    1.994438
4   0   1   1   7.638720    9.914861    6.638720    25.640006   -1.305679e+11   129.923249  146.277785  51.979295   -6.818467e+11   0.164374    1.500932    2.37375 2.563449    6.954085    2.079635

一开始有三个分类功能。

以下是我的目标矢量(Y)的样子:

0   -0.003094
1   -0.015327
2    0.100617
3    0.067728
4    0.089962

两者目前都是熊猫数据框/系列。

现在我使用scikit.from的/HotEncoder在X中重新编码我的分类变量

sklearn import preprocessing
X_train=preprocessing.OneHotEncoder(categorical_features=[0,1,2],sparse=False).fit_transform(data_train)

这会将数据转换为以下内容:

X_train[0:2]
Out[473]:
array([[  1.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   1.00000000e+00,
         -3.57621738e+06,  -5.14687655e+06,  -3.47150677e+06,
         -2.63382189e+06,  -3.68092799e+06,   9.15753144e+01,
          9.92784200e+01,  -5.67042960e+06,  -3.78563860e+06,
         -4.83274471e+06,  -5.46100838e+06,  -3.36679616e+06,
         -3.99505983e+06,  -5.56571899e+06,  -1.69142639e+06],
       [  0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   1.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   0.00000000e+00,
          0.00000000e+00,   0.00000000e+00,   1.00000000e+00,
          5.71348642e+00,   5.63529053e-01,   4.71348642e+00,
          2.19691610e+01,  -5.00000000e+06,   8.86255560e+01,
          9.22444788e+01,   2.36252526e+01,   1.30950000e+10,
          1.08917343e+00,   9.83266854e-01,   0.00000000e+00,
          1.47105308e+00,   3.86057046e+00,   2.05792067e+00]])

在此之后,我做了缺失值插补:

X_imputed=preprocessing.Imputer().fit_transform(X_train) 
X_imputed[0:1]
Out[474]:
array([[       1.        ,        0.        ,        0.        ,
               0.        ,        1.        ,        0.        ,
               0.        ,        0.        ,        0.        ,
               0.        ,        0.        ,        0.        ,
               0.        ,        0.        ,        1.        ,
        -3576217.38305151, -5146876.54603993, -3471506.77218561,
        -2633821.88525845, -3680927.9939174 ,       91.57531444,
              99.27842   , -5670429.60036941, -3785638.6047833 ,
        -4832744.71344225, -5461008.37863762, -3366796.16131972,
        -3995059.82651509, -5565718.98950351, -1691426.3874654 ]])

现在我开始对变量的顺序感到困惑,因为在使用oneHotencoder后,我的数据帧被转换为numpy数组并剥离了标题。所以我不确定前13列(三个分类的假人是什么,以什么顺序?

其次,我继续运行LassoCV以获得Lasso的正确alpha值和相应的系数。

from sklearn import linear_model 
lasso=linear_model.LassoCV(max_iter=2000,cv=10,normalize=True)
lasso.fit(X_imputed,Y_train)

当我使用交叉验证检查最终选择的alpha值时 它给了这个:

lasso.alpha_
Out[476]:
4.1303618102099771e-05

所以假设这个alpha值是最好的,它在所有10倍的情况下提供最少的MSE。

但是现在当我试图为它尝试的所有alphas找到套索路径时,这就是我得到的。我正在创建一个numpy数组,用于存储套索选择的每个alpha的所有10倍的MSE(100个alphas 10倍)

scores=np.zeros((100,2))
scores[:,0]=lasso.mse_path_[:,0]
scores[:,1]=np.mean(lasso.mse_path_[:,1:],axis=1)
scr=scores[scores[:,1].argsort()]

由于我按每个alpha的MSE升序对我的分数矩阵进行了排序,我希望第一条记录能够显示分数为min的alpha。

scr[0]
Out[477]:
array([ 441334.91133953,       0.00739538])

但是我看到alpha值与使用lasso.alpha_的上一步完全不同。这是-5的幂,这是+5的力量。这是为什么?。

第三,这是来自套索的系数向量。我如何知道哪个系数映射到原始数据集(data_train)中的哪个特征?这就是我最终需要从最佳选择的alpha获得与每个特征相对应的权重。

lasso.coef_
Out[478]:
array([ 0.02930289,  0.01039652, -0.        , -0.05448752,  0.01310975,
        0.        , -0.03755883,  0.02754805, -0.0498908 , -0.10531218,
       -0.08303772,  0.00465392,  0.        , -0.04597282,  0.        ,
        0.00000003,  0.        ,  0.        ,  0.        ,  0.        ,
       -0.00101291,  0.00155892,  0.        ,  0.        ,  0.        ,
        0.        , 

现在因为标题被剥离而且全部,我不知道哪些权重对应于哪个特征。另外,当我选择lasso.alpha_或者当我执行lasso_mse_path_并检查最低的mse时,为什么alpha值不同。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

要将要素索引与原始要素列相关联,您可以在拟合后使用feature_indices_ OneHotEncoder属性:

from sklearn import preprocessing
encoder = preprocessing.OneHotEncoder(categorical_features=[0,1,2])
X_train = encoder.fit_transform(data_train)
print encoder.feature_indices_

输出:

[0 4 6 8]

根据documentation

  

feature_indices_:形状数组(n_features,)   特征范围的指数。原始数据中的特征i映射到feature_indices_ [i]到feature_indices_ [i + 1]的特征(之后可能被active_features_屏蔽)

在这种情况下,单热编码空间中的前4个维度对应于列Year,后2个对应于列Country,后2个对应于SW