pandas進行one-hot編碼
阿新 • • 發佈:2018-12-15
1.讀取資料
本文采用的是美國成年人收入的資料集
import pandas as pd from IPython.display import display data = pd.read_csv( adult_path, header=None, index_col=False, names=['age', 'workclass', 'fnlwgt', 'education', 'education-num', 'marital-status', 'occupation', 'relationship', 'race', 'gender', 'capital-gain', 'capital-loss', 'hours-per-week', 'native-country', 'income'])
2.檢查字串的分類資料
使用pandas Series 的value_counts函式,顯示類別和出現次數
print(data.gender.value_counts())
#輸出
Male 21790
Female 10771
Name: gender, dtype: int64
3.對資料進行one-hot編碼
利用get_dummies函式自動轉換物件(通常預設類別的結果是字串)
print("Original features:\n", list(data.columns), "\n") data_dummies = pd.get_dummies(data) print("Features after get_dummies:\n", list(data_dummies.columns)) display(data_dummies.head(n=2))
3.將結果存到NumPy陣列
利用values屬性將data_dummies資料框轉換為NumPy,作為訓練集。僅取包含特徵的列(本例是從age到occupation_Transport-moving),不包含目標值。
features = data_dummies.loc[:, 'age':'occupation_ Transport-moving']
# extract NumPy arrays
X = features.values
y = data_dummies['income_ >50K'].values
4.訓練模型
本例進行logic迴歸
from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) logreg = LogisticRegression() logreg.fit(X_train, y_train) print("Test score: {:.2f}".format(logreg.score(X_test, y_test))) #輸出 Test score: 0.81
此外,有些分類變數的值是數字,此時直接呼叫get_dummies不能為其編碼。為了解決這個問題:首先,將資料框中的數值列轉換成字串;然後,使用colums引數顯示地給出想要編碼的列
demo_df['Integer Feature'] = demo_df['Integer Feature'].astype(str)
display(pd.get_dummies(demo_df, columns=['Integer Feature', 'Categorical Feature']))