3

的主要目標如下:特徵預處理scikit學習

1)應用StandardScaler到連續變量

2)應用LabelEncoderOnehotEncoder到分類變量

連續變量需要縮放,但同時一些分類變量也是整數類型。應用StandardScaler會導致不良影響。

另一方面,StandardScaler會縮放基於整數的分類變量,這也不是我們想要的。

由於連續變量和分類變量混合在一個Pandas DataFrame中,建議的工作流程解決此類問題的方式是什麼?

最好的例子來說明我的觀點是Kaggle Bike Sharing Demand數據集,其中seasonweather是整數分類變量

+0

由於'StandardScalar'按列方式工作,我不認爲它會對單熱編碼變量做任何事情。您是否嘗試過爲單個數據框做上述操作?你有沒有發現你似乎遇到麻煩的行爲? –

+0

單熱編碼變量與整數類型的變量相同。如果你將它們連接在一起,爲什麼你會期望它們做任何不同的事情?如果它們的行爲方式相同,那麼如果存在一個不是分類但數字的變量,並且其值爲1或0,然後對其使用縮放器,則會發生什麼? –

+0

我試過了,顯然它確實擴展了一切,不管它們的值是什麼。你能否在這個Bike數據集上應用'StandardScaler()。fit_transform(df)'並告訴我其他情況? –

回答

6

時退房sklearn_pandas.DataFrameMapper元變壓器。使用它作爲第一步,在你的管道進行逐列數據工程業務:

mapper = DataFrameMapper(
    [(continuous_col, StandardScaler()) for continuous_col in continuous_cols] + 
    [(categorical_col, LabelBinarizer()) for categorical_col in categorical_cols] 
) 
pipeline = Pipeline(
    ("mapper", mapper) 
) 
pipeline.fit_transform(df, df["y"]) 

此外,你應該使用sklearn.preprocessing.LabelBinarizer代替[LabelEncoder(), OneHotEncoder()]列表。

+0

'sklearn_pandas.DataFrameMapper'真棒,絕對值得一試。謝謝你讓我知道。但根據文檔,在你有一個具有多個值的目標變量的情況下,應該使用'LabelBinarizer',而不是每個具有一組不同值的多個變量,對嗎?不知道我是否得到它。 –

+0

'LabelBinarizer'是編碼字符串列的正確選擇 - 它將首先將字符串轉換爲整數,然後將這些整數二進制化爲位向量。它一氣呵成。無需在兩個變壓器步驟(即'LabelEncoder'加'OneHotEncoder')之間劃分此「工作流程」。只要試試真實的數據,你就會喜歡它。 – user1808924