2016-12-08 26 views
1

我有一個pandas.DataFrame,看起來像:地圖scikit縮放數據傳回ID

In [48]: df 
Out[48]: 
     AMID   A   B   C 
0 AMID-1000 0.149176 0.768200 0.689369 
1 AMID-1001 0.169934 0.607390 0.471788 
2 AMID-1002 0.632052 0.806657 0.994664 
3 AMID-1003 0.003798 0.382427 0.894856 
4 AMID-1004 0.182947 0.712373 0.870068 
5 AMID-1005 0.385039 0.691643 0.546960 
6 AMID-1006 0.971885 0.169759 0.804370 
7 AMID-1007 0.443199 0.686212 0.377556 
8 AMID-1008 0.149402 0.981370 0.588750 
9 AMID-1009 0.214107 0.264285 0.463403 

'AMID'保存數據點的id和列的其餘部分中的每一個數據點的每一個的特徵。

我想要使用這個數據集的算法,要求數據縮放,以便對於每列我有mean == 0std == 1。我爲此使用sklearn.preprocessing.StandardScaler,但是,爲了進行縮放,我需要清除非數值列的數據集'AMID'列。

In [61]: from sklearn import preprocessing 

In [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_scaled 
Out[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_copy 
Out[74]: 
     AMID   A   B   C 
0 AMID-1000 -0.660180 0.768200 0.689369 
1 AMID-1001 -0.584459 0.607390 0.471788 
2 AMID-1002 1.101281 0.806657 0.994664 
3 AMID-1003 -1.190499 0.382427 0.894856 
4 AMID-1004 -0.536992 0.712373 0.870068 
5 AMID-1005 0.200213 0.691643 0.546960 
6 AMID-1006 2.340942 0.169759 0.804370 
7 AMID-1007 0.412372 0.686212 0.377556 
8 AMID-1008 -0.659358 0.981370 0.588750 
9 AMID-1009 -0.423321 0.264285 0.463403 

但我不知道這是否會歪曲原來'AMID'與換算值之間的關係爲每列。

有沒有更好的方法來做到這一點?

+1

'但是,我需要做的是將縮放後的數據映射回'AMID',這樣我就可以分別爲每個AMID值記錄分類器的.predict()輸出。不要取得它。你可以重新配製嗎? – MMF

+0

我對每個數據點都有基本事實,所以實際上我可以評估分類器的性能,即使沒有映射到「AMID」。但是我也需要知道哪個特定的汽車('AMID')屬於哪一類。所以我想這將需要遍歷數據集並將每個數據點分別提供給分類器。總之,我想知道分類器爲每個「AMID」預測的結果。謝謝! – Thanos

+0

'我有每個數據點的基本事實'。如果你有班級,那麼你想得到什麼? - >'但我還需要知道哪個特定的汽車(AMID)屬於哪一類'?我沒有得到它 – MMF

回答

2

IIUC,我只是設置AMID作爲索引(這樣不會干擾,並使其更容易後),然後重新在旅途中數據幀,像這樣:

df.set_index('AMID', inplace=True) 
from sklearn import preprocessing 
scaler = preprocessing.StandardScaler() 
df = pd.DataFrame(scaler.fit_transform(df), index=df.index, columns=df.columns) 
df 

        A   B   C 
AMID         
AMID-1000 -0.660181 0.663739 0.095517 
AMID-1001 -0.584459 0.001476 -0.987447 
AMID-1002 1.101281 0.822116 1.615059 
AMID-1003 -1.190499 -0.924988 1.118286 
AMID-1004 -0.536990 0.433827 0.994909 
AMID-1005 0.200213 0.348455 -0.613294 
AMID-1006 2.340943 -1.800818 0.667911 
AMID-1007 0.412372 0.326088 -1.456467 
AMID-1008 -0.659357 1.541636 -0.405293 
AMID-1009 -0.423322 -1.411532 -1.029181 

你可以reset_index()如果你想AMID作爲列而不是索引,但恕我直言,它是更好的一個指數(我假設你想在稍後適合另一個模型...)

+1

Tu asétéplus rapide que moi! Bienjoué。您好,歡迎發表評論! – MMF

+1

Oui,剛纔看到你提出這個太:)是的 –

+1

這很好,謝謝! – Thanos