預處理 - 類別資料
在此頁面上,W3schools.com 與 紐約資料科學學院 合作,為我們的學生提供數字培訓內容。
類別資料
當你的資料包含由字串表示的類別時,將很難使用它們來訓練通常只接受數字資料的機器學習模型。
與其忽略類別資料並將其資訊排除在模型之外,不如轉換資料,使其可以在你的模型中使用。
請看下錶,這是我們在多元迴歸章節中使用過的相同資料集。
示例
import pandas as pd
cars = pd.read_csv('data.csv')
print(cars.to_string())
結果
Car Model Volume Weight CO2 0 Toyoty Aygo 1000 790 99 1 Mitsubishi Space Star 1200 1160 95 2 Skoda Citigo 1000 929 95 3 Fiat 500 900 865 90 4 Mini Cooper 1500 1140 105 5 VW Up! 1000 929 105 6 Skoda Fabia 1400 1109 90 7 Mercedes A-Class 1500 1365 92 8 Ford Fiesta 1500 1112 98 9 Audi A1 1600 1150 99 10 Hyundai I20 1100 980 99 11 Suzuki Swift 1300 990 101 12 Ford Fiesta 1000 1112 99 13 Honda Civic 1600 1252 94 14 Hundai I30 1600 1326 97 15 Opel Astra 1600 1330 97 16 BMW 1 1600 1365 99 17 Mazda 3 2200 1280 104 18 Skoda Rapid 1600 1119 104 19 Ford Focus 2000 1328 105 20 Ford Mondeo 1600 1584 94 21 Opel Insignia 2000 1428 99 22 Mercedes C-Class 2100 1365 99 23 Skoda Octavia 1600 1415 99 24 Volvo S60 2000 1415 99 25 Mercedes CLA 1500 1465 102 26 Audi A4 2000 1490 104 27 Audi A6 2000 1725 114 28 Volvo V70 1600 1523 109 29 BMW 5 2000 1705 114 30 Mercedes E-Class 2100 1605 115 31 Volvo XC70 2000 1746 117 32 Ford B-Max 1600 1235 104 33 BMW 216 1600 1390 108 34 Opel Zafira 1600 1405 109 35 Mercedes SLK 2500 1395 120
執行示例 »
在多元迴歸章節中,我們試圖根據發動機的排量和汽車的重量來預測排放的 CO2,但我們排除了有關汽車品牌和型號的資訊。
有關汽車品牌或汽車型號的資訊可能會幫助我們更準確地預測排放的 CO2。
廣告
獨熱編碼 (One Hot Encoding)
由於“Car”(汽車)或“Model”(型號)列不是數字,我們無法在資料中使用它們。無法確定類別變數(汽車或型號)與數值變數(CO2)之間的線性關係。
為了解決這個問題,我們必須對類別變數有一個數字表示。一種方法是為類別中的每個組建立一個單獨的列。
對於每一列,值將是 1 或 0,其中 1 表示包含該組,0 表示排除該組。這種轉換稱為獨熱編碼。
你不必手動完成,Python Pandas 模組有一個名為 get_dummies()
的函式,它會執行獨熱編碼。
在我們的Pandas 教程中瞭解 Pandas 模組。
示例
對“Car”列進行獨熱編碼
import pandas as pd
cars = pd.read_csv('data.csv')
ohe_cars = pd.get_dummies(cars[['Car']])
print(ohe_cars.to_string())
結果
Car_Audi Car_BMW Car_Fiat Car_Ford Car_Honda Car_Hundai Car_Hyundai Car_Mazda Car_Mercedes Car_Mini Car_Mitsubishi Car_Opel Car_Skoda Car_Suzuki Car_Toyoty Car_VW Car_Volvo 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 6 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 7 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 8 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 9 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 12 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 13 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 14 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 15 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 16 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 19 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 20 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 21 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 22 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 23 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 25 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 26 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 27 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 29 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 32 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 33 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 34 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 35 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
執行示例 »
結果
為“Car”列中的每個汽車品牌建立了一個列。
預測 CO2
除了排量和重量之外,我們還可以利用這些額外的資訊來預測 CO2。
要合併這些資訊,我們可以使用 Pandas 的 concat()
函式。
首先,我們需要匯入一些模組。
我們將從匯入 Pandas 開始。
import pandas
Pandas 模組允許我們讀取 csv 檔案並操作 DataFrame 物件。
cars = pandas.read_csv("data.csv")
它還允許我們建立虛擬變數。
ohe_cars = pandas.get_dummies(cars[['Car']])
然後,我們必須選擇自變數 (X) 並按列新增虛擬變數列。
同時將因變數儲存在 y 中。
X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1)
y = cars['CO2']
我們還需要從 sklearn 匯入一個方法來建立一個線性模型。
瞭解線性迴歸。
from sklearn import linear_model
現在我們可以將資料擬合到線性迴歸模型。
regr = linear_model.LinearRegression()
regr.fit(X,y)
最後,我們可以根據汽車的重量、排量和製造商來預測 CO2 排放量。
## 預測一輛重量為 2300kg,排量為 1300cm3 的沃爾沃汽車的 CO2 排放量
predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]])
示例
import pandas
from sklearn import linear_model
cars = pandas.read_csv("data.csv")
ohe_cars = pandas.get_dummies(cars[['Car']])
X = pandas.concat([cars[['Volume', 'Weight']], ohe_cars], axis=1)
y = cars['CO2']
regr = linear_model.LinearRegression()
regr.fit(X,y)
## 預測一輛重量為 2300kg,排量為 1300cm3 的沃爾沃汽車的 CO2 排放量
predictedCO2 = regr.predict([[2300, 1300,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0]])
print(predictedCO2)
結果
[122.45153299]
執行示例 »
現在我們有了排量、重量以及資料集中每個汽車品牌的係數。
啞變數化 (Dummifying)
不一定需要為類別中的每個組建立一個列。可以使用比組數少 1 列的資訊。
例如,你有一個表示顏色的列,該列中有兩種顏色:紅色和藍色。
示例
import pandas as pd
colors = pd.DataFrame({'color': ['blue', 'red']})
print(colors)
結果
color 0 blue 1 red
執行示例 »
你可以建立一個名為“red”的列,其中 1 表示紅色,0 表示非紅色,這意味著它是藍色。
要做到這一點,我們可以使用與獨熱編碼相同的函式 `get_dummies`,然後刪除其中一列。有一個引數 `drop_first`,它允許我們從結果表中排除第一列。
示例
import pandas as pd
colors = pd.DataFrame({'color': ['blue', 'red']})
dummies = pd.get_dummies(colors, drop_first=True)
print(dummies)
結果
color_red 0 0 1 1
執行示例 »
如果你有超過 2 個組怎麼辦?如何用少 1 列來表示多個組?
假設我們這次有三種顏色:紅色、藍色和綠色。當我們使用 `get_dummies` 並刪除第一列時,我們得到下表。
示例
import pandas as pd
colors = pd.DataFrame({'color': ['blue', 'red', 'green']})
dummies = pd.get_dummies(colors, drop_first=True)
dummies['color'] = colors['color']
print(dummies)
結果
color_green color_red color 0 0 0 blue 1 0 1 red 2 1 0 green
執行示例 »