我正在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值不同。
有什么想法吗?
答案 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]
feature_indices_:形状数组(n_features,) 特征范围的指数。原始数据中的特征i映射到feature_indices_ [i]到feature_indices_ [i + 1]的特征(之后可能被active_features_屏蔽)
在这种情况下,单热编码空间中的前4个维度对应于列Year
,后2个对应于列Country
,后2个对应于SW
。