python - 将系数向量分配回 scikit learn Lasso 中的特征

标签 python numpy pandas scikit-learn

我正在 scikit learn 中的数据集上运行套索。这是我的设计矩阵(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

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

现在我使用 scikit.from 的 oneHotEncoder 在 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。

但是现在,当我尝试找到它尝试过的所有 alpha 的套索路径时,这就是我得到的。我正在创建一个 numpy 数组来存储 lasso 选择的每个 alpha 的所有 10 倍的 MSE(10 个 alpha 为 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 升序对分数矩阵进行排序,因此我希望第一条记录显示分数为最小值的 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 值不同。

有什么想法吗?

最佳答案

要将特征索引关联回原始特征列,您可以在拟合后使用 OneHotEncoderfeature_indices_ 属性:

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_ : array of shape (n_features,) Indices to feature ranges. Feature i in the original data is mapped to features from feature_indices_[i] to feature_indices_[i+1] (and then potentially masked by active_features_ afterwards)

在本例中,one-hot 编码空间中的前 4 个维度对应于列 Year,接下来的 2 个维度对应于列 Country,最后 2 个维度对应于列SW

关于python - 将系数向量分配回 scikit learn Lasso 中的特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852233/

相关文章:

python - xlsxwriter: "inf"值如何可以不着色?

python - scipy.linalg.eig 返回协方差矩阵的复杂特征值?

python - 计算 3D 和 2D NumPy 数组的加权和

python - 根据其他数据帧的列映射数据帧

python - 如何过滤前 N 项的 groupby

python - Scapy模块: netif = rt[4 + mtu_present + prio_present + refs_present + locked] IndexError: list index out of range

python - 系列的平均值,跳过元素[0]

python - 我可以可视化 datasets.Dataset 的内容吗?

python - 如何将数据帧与 pandas 中的冗余行结合起来

python - 将标准库提取到方法文件