我有一个pandas.DataFrame
,看起来像这样:
In [48]: dfOut[48]: AMID A B C0 AMID-1000 0.149176 0.768200 0.6893691 AMID-1001 0.169934 0.607390 0.4717882 AMID-1002 0.632052 0.806657 0.9946643 AMID-1003 0.003798 0.382427 0.8948564 AMID-1004 0.182947 0.712373 0.8700685 AMID-1005 0.385039 0.691643 0.5469606 AMID-1006 0.971885 0.169759 0.8043707 AMID-1007 0.443199 0.686212 0.3775568 AMID-1008 0.149402 0.981370 0.5887509 AMID-1009 0.214107 0.264285 0.463403
列'AMID'
包含数据点的ID,其余每一列都是每个数据点的特征。
我想使用这个数据集来运行一个需要数据缩放的算法,以便每列的mean == 0
和std == 1
。我使用sklearn.preprocessing.StandardScaler
来实现这一点,但是为了缩放,我需要从数据集中移除非数值的'AMID'
列。
In [61]: from sklearn import preprocessingIn [62]: data = df[[_ for _ in df.columns.values.tolist() if _ not in ['AMID']]]In [64]: scaler = preprocessing.StandardScaler().fit(data)In [65]: data_scaled = scaler.transform(data)In [66]: data_scaledOut[66]: array([[ -6.60180258e-01, 6.63739262e-01, 9.55187160e-02], [ -5.84458777e-01, 1.47534202e-03, -9.87448200e-01], [ 1.10128130e+00, 8.22117198e-01, 1.61505880e+00], [ -1.19049913e+00, -9.24989864e-01, 1.11828380e+00], [ -5.36991596e-01, 4.33827828e-01, 9.94906952e-01], [ 2.00212895e-01, 3.48454485e-01, -6.13293011e-01], [ 2.34094244e+00, -1.80081691e+00, 6.67913149e-01], [ 4.12372276e-01, 3.26087187e-01, -1.45646800e+00], [ -6.59357873e-01, 1.54163661e+00, -4.05292050e-01], [ -4.23321269e-01, -1.41153114e+00, -1.02918017e+00]])In [67]: data_scaled.mean(axis=0)Out[67]: array([ -8.32667268e-17, -4.44089210e-17, -2.88657986e-16])In [68]: data_scaled.std(axis=0)Out[68]: array([ 1., 1., 1.])
到目前为止,一切看起来都很好!
现在我可以继续将这些数据输入我的模型,然后用测试数据(也使用相同的缩放器和拟合进行缩放)进行测试。然而,我需要能够准确地看到分类器对每个AMID
的预测结果。因此,我在考虑是否应该将缩放后的数据映射回每个数据点的AMID
,然后使用分类器的.predict()
方法单独尝试每个数据点,或者以某种方式将.predict()
的结果映射回AMID
列表。
我的第一个想法是将新值分配给原始数据框,像这样:
In [73]: df_copy['A'] = data_scaled[:,0:1]In [74]: df_copyOut[74]: AMID A B C0 AMID-1000 -0.660180 0.768200 0.6893691 AMID-1001 -0.584459 0.607390 0.4717882 AMID-1002 1.101281 0.806657 0.9946643 AMID-1003 -1.190499 0.382427 0.8948564 AMID-1004 -0.536992 0.712373 0.8700685 AMID-1005 0.200213 0.691643 0.5469606 AMID-1006 2.340942 0.169759 0.8043707 AMID-1007 0.412372 0.686212 0.3775568 AMID-1008 -0.659358 0.981370 0.5887509 AMID-1009 -0.423321 0.264285 0.463403
但我不确定这是否会扭曲原始'AMID'
与每列缩放值之间的关联。
有没有更好的方法来做这件事?
回答:
如果我理解正确的话,我会将AMID
设置为索引(这样它就不会干扰,并且之后更容易处理),然后在运行时重新创建一个数据框,像这样:
df.set_index('AMID', inplace=True)from sklearn import preprocessingscaler = preprocessing.StandardScaler()df = pd.DataFrame(scaler.fit_transform(df), index=df.index, columns=df.columns)df A B CAMID AMID-1000 -0.660181 0.663739 0.095517AMID-1001 -0.584459 0.001476 -0.987447AMID-1002 1.101281 0.822116 1.615059AMID-1003 -1.190499 -0.924988 1.118286AMID-1004 -0.536990 0.433827 0.994909AMID-1005 0.200213 0.348455 -0.613294AMID-1006 2.340943 -1.800818 0.667911AMID-1007 0.412372 0.326088 -1.456467AMID-1008 -0.659357 1.541636 -0.405293AMID-1009 -0.423322 -1.411532 -1.029181
如果你希望AMID
作为列而不是索引,你可以使用reset_index()
,但在我看来,作为索引更好(我假设你之后想要在这个基础上拟合另一个模型…)