1. 程式人生 > >pandas進行one-hot編碼

pandas進行one-hot編碼

 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']))