1. 程式人生 > >sklearn 處理文字和分類屬性[LabelBinarizer, LabelEncoder,OneHotEncoder]

sklearn 處理文字和分類屬性[LabelBinarizer, LabelEncoder,OneHotEncoder]

sklearn 利用LabelBinarizer, LabelEncoder,OneHotEncoder來處理文字和分類屬性

對於分類和文字屬性,需要將其轉換為離散的數值特徵才能餵給機器學習演算法,常用的是轉化為 one-hot編碼格式。

df = pd.DataFrame({'ocean_proximity':["<1H OCEAN","<1H OCEAN","NEAR OCEAN","INLAND", "<1H OCEAN", "INLAND"],
                  'population': [339.0, 113.0, 462.0, 353.9,1463.9
, 570.0]})

1. LabelEncoder

將文字屬性轉化為離散的數值屬性

from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
df_cat = df["ocean_proximity"]
df_cat_encoder = encoder.fit_transform(housing_cat)
df_cat_encoder

out: 返回的是一個numpy的陣列

array([0, 0, 2, 1, 0, 1], dtype=int64)

可以使用encoder.classes_來檢視類別

encoder.
classes_

out:

array([’<1H OCEAN’, ‘INLAND’, ‘NEAR OCEAN’], dtype=object)

注意: 機器學習演算法通常認為兩個相差較小的值要比兩個相差較大的值更相似,但是 0和2(<1H OCEAN 和 NEAR OCEAN )要比0和1(<1H OCEAN 和 INLAND)更相似,為解決這個問題,採用one_hot編碼. one_hot編碼任何兩值之間的距離相等。

OneHotEncoder

將LabelEncoder得到的值轉化為one_hot編碼格式

from sklearn.preprocessing import
OneHotEncoder encoder = OneHotEncoder() df_cat_1hot = encoder.fit_transform(df_cat_encoder.reshape(-1, 1)) df_cat_1hot

out:

<6x3 sparse matrix of type ‘<class ‘numpy.float64’>’ with 6 stored elements in Compressed Sparse Row format>

返回的是一個scipy的稀疏矩陣,可以佔據更少的記憶體

# toarray()轉換為numpy的陣列
df_cat_1hot. toarray()

out:

array([[1., 0., 0.], [1., 0., 0.], [0., 0., 1.], [0., 1., 0.], [1., 0., 0.], [0., 1., 0.]])

注意: one_hot中fit_transform講解 fit_transform(X, y=None) 引數:X :shape [n_samples, n_feature]

  • n_samples: 樣本數量
  • n_features: 特徵值數量 按列處理資料,下面一個例子說明一下:
df = pd.DataFrame([[0, 0, 3], [1, 1, 0], [0, 2, 1],[1, 0, 2]])
df
# out:
   0	1	2
0	0	0	3
1	1	1	0
2	0	2	1
3	1	0	2
df_encodered = encoder.fit_transform(df)
df_encodered.toarray()

# out : 
array([[1., 0., 1., 0., 0., 0., 0., 0., 1.],
       [0., 1., 0., 1., 0., 1., 0., 0., 0.],
       [1., 0., 0., 0., 1., 0., 1., 0., 0.],
       [0., 1., 1., 0., 0., 0., 0., 1., 0.]])

分析一下: df有4個樣本,3列。 第一列為[0,1]有兩類,所以轉換為one_hot時,為10 和 01, 第一列為[0,1,2]有兩類,所以轉換為one_hot時,為10 0和 010, 001 第一列為[0,1,2,3]有兩類,所以轉換為one_hot時,為10 00和 0100, 0010,0001

可以看出輸出df_encodered的前兩列為df第1列的one_hot編碼,第3,4,5列為df第2列的one_hot編碼,後4列為df第3列的one_hot編碼

LabelBinarizer

LabelBinarizer一步到位,直接完成上述兩部操作哦

from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer()
df_cat_1hot = encoder.fit_transform(df_cat)
df_cat_1hot

# out:
array([[1, 0, 0],
       [1, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [1, 0, 0],
       [0, 1, 0]])

預設輸出為numpy的array,在LabelBinarizer中傳入sparse_output=True,可以返回稀疏矩陣

from sklearn.preprocessing import LabelBinarizer
encoder = LabelBinarizer(sparse_output=True)
df_cat_1hot = encoder.fit_transform(df_cat)
df_cat_1hot

out:

<6x3 sparse matrix of type ‘<class ‘numpy.int32’>’ with 6 stored elements in Compressed Sparse Row format>