使用sklearn來處理類別數據

轉載自:https://blog.csdn.net/sinat_29957455/article/details/79452141算法

在處理真實的數據集的時候,咱們常常會碰見一個或多個的類別數據的特徵。類別數據能夠被分爲標稱特徵(nominal feature)和有序特徵(ordinal feature)。有序特徵指的是類別的值是有序的或者是能夠排序的,例如,衣服的尺碼S、M、X、XL、XXL...就是屬於有序特徵。再例如,衣服的顏色,黑色、藍色、白色、黃色...這些就屬於標稱特徵。app

1、有序特徵的映射機器學習

咱們能夠將有序特徵裝換成爲整數,整數包含必定的順序。沒有一個合適的方法能夠自動將尺寸特徵轉換成爲正確的順序,因此咱們須要手動來指定相應的映射關係。例如,S:1,M:2,X:3,咱們能夠利用pandas的map方法來實現。學習

import pandas as pd

if __name__ == "__main__":
\#定義衣服尺寸的映射關係
size_mapping = {"S":1,"M":2,"X":3,"XL":4}
\#定義一個DataFrame數據
data = pd.DataFrame([
["green","S",100],
["blue", "M", 110],
["red", "X", 120],
["black", "XL", 130]
])
\#設置列名
data.columns = ["color","size","price"]
\#對size列的類別數據進行映射
data["size"] = data["size"].map(size_mapping)
print(data)

2、類標的編碼編碼

許多的機器學習算法都要求將類標換成整數值來進行處理。對於類標進行編碼與以前對於有序特徵的映射有所不一樣,類標並不要求是有序的,對於特定的字符串類標賦予哪一個整數值給它對於咱們來講並不重要,因此在對於類標進行編碼的時候咱們可使用枚舉的方式從0開始設定類標。spa

import pandas as pd
import numpy as np

if __name__ == "__main__":
\# 定義一個DataFrame數據
data = pd.DataFrame([
["green", "S", 100,"label1"],
["blue", "M", 110,"label2"],
["red", "X", 120,"label3"],
["black", "XL", 130,"label4"]
])
\# 設置列名
data.columns = ["color", "size", "price","label"]
\#經過枚舉獲取類標與整數之間的映射關係
label_mapping = {label:idx for idx,label in enumerate(np.unique(data["label"]))}
print(label_mapping)
\#對label列進行映射
data["label"] = data["label"].map(label_mapping)
print(data)

經過下面的方法能夠將整數類標還原爲字符串.net

inv_label_mapping = {v:k for k,v in label_mapping.items()}
data["label"] = data["label"].map(inv_label_mapping)
print(data)

還能夠經過sklearn的LabelEncoder類來實現類標的編碼code

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder

if __name__ == "__main__":
\# 定義一個DataFrame數據
data = pd.DataFrame([
["green", "S", 100,"label1"],
["blue", "M", 110,"label2"],
["red", "X", 120,"label3"],
["black", "XL", 130,"label4"]
])
\# 設置列名
data.columns = ["color", "size", "price","label"]
class_label = LabelEncoder()
data["label"] = class_label.fit_transform(data["label"].values)
print(data)

經過sklearn的inverse_transform方法能夠將整數類標還原爲原始的字符串orm

data["label"] = class_label.inverse_transform(data["label"])
print(data)

3、標稱特徵上的獨熱編碼(one-hot encoding)blog

咱們對上面衣服的顏色特徵進行編碼,將顏色映射爲{"green":0,"blue":1,"red":2,"black":3}。看起來這樣映射好像沒什麼問題,真的沒有問題嗎?實則否則,咱們這樣映射實際上給顏色強加了一個大小關係,即black>red>blue>green,實際上顏色是不存在這種關係的,很顯然結果確定也不是最優的。這時,咱們能夠經過獨熱編碼(one-hot encoding)來解決這一類問題。獨熱編碼是經過建立一個新的虛擬特徵,虛擬特徵的每一列各表明標稱數據的一個值。例如,顏色一共有四個取值green、blue、red、black,獨熱編碼是經過四位二進制來表示,若是是green就表示爲[1,0,0,0],對應的顏色是[green,blue,red,black],若是屬於哪種顏色,則取值爲1,不然爲0。

使用sklearn的OneHotEncoder實現OneHot編碼

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

if __name__ == "__main__":
\# 定義一個DataFrame數據
data = pd.DataFrame([
["green", "S", 100, "label1"],
["blue", "M", 110, "label2"],
["red", "X", 120, "label3"],
["black", "XL", 130, "label4"]
])
\# 設置列名
data.columns = ["color", "size", "price", "label"]
X = data[["color", "price"]].values
\#經過類標編碼將顏色裝換成爲整數
color_label = LabelEncoder()
X[:,0] = color_label.fit_transform(X[:,0])
\#設置顏色列使用oneHot編碼
one_hot = OneHotEncoder(categorical_features=[0])
print(one_hot.fit_transform(X).toarray())

注意:在使用OneHotEncoder進行OneHot編碼的時候,須要先將字符串轉換成爲整數以後才能進行OneHot編碼,否則會報錯。

使用pandas來實現oneHot編碼

import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

if __name__ == "__main__":
\# 定義一個DataFrame數據
data = pd.DataFrame([
["green", "S", 100, "label1"],
["blue", "M", 110, "label2"],
["red", "X", 120, "label3"],
["black", "XL", 130, "label4"]
])
\# 設置列名
data.columns = ["color", "size", "price", "label"]
X = data[["color", "price"]].values
\#pandas的get_dummies方法只對字符串列進行轉換,其餘的列保持不變
print(pd.get_dummies(data[["color","price"]]))
相關文章
相關標籤/搜索