簡體   English   中英

使用 Scikit-Learn 對分類數據進行回歸 model

[英]Make regression model with categorical data with Scikit-Learn

我有一個超過 10 列的 CSV 文件,其中一些列有分類數據,一些分類列只有yesno值,有些列有 colors ( green , blue , red ...) 有些列有其他字符串值.

有沒有辦法對所有列進行回歸 model ?

我知道yesno值可以表示為 1 和 0,但我讀過用數字表示顏色名稱或城市名稱並不好。 有沒有更好/正確的方法來做到這一點?

這是帶有虛擬數據的簡單代碼:

import pandas as pd
from sklearn.linear_model import LinearRegression

df = pd.DataFrame({'par1':[1,3,5,7,9, 11,13],
                   'par2':[0.2, 0.4, 0.5, 0.7, 1, 1.2, 1.45],
                   'par3':['yes', 'no', 'no', 'yes', 'no', 'yes', 'no'],
                   'par4':['blue', 'red', 'red', 'blue', 'green', 'green', 'blue'],
                   'output':[103, 310, 522, 711, 921, 1241, 1451]})

print(df)

features = df.iloc[:,:-1]
result = df.iloc[:,-1]

reg = LinearRegression()
model = reg.fit(features, result)

prediction = model.predict([[2, 0.33, 'no', 'red']])

reg_score = reg.score(features, result)

print(prediction, reg_score)

在我使用的真實數據集中,這些字符串值對數據集非常重要,所以我不能只刪除該列

您通常會“ 一次性編碼”分類變量。 這也稱為“添加虛擬變量”。

您還需要“ 標准化”數值變量。

Scikit-learn 使這變得簡單:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

t = ColumnTransformer(transformers=[
    ('onehot', OneHotEncoder(), ['par3', 'par4']),
    ('scale', StandardScaler(), ['par1', 'par2'])
], remainder='passthrough') # Default is to drop untransformed columns

t.fit_transform(df)

最后,在通過 model 運行輸入之前,您需要以相同的方式轉換輸入。

把它們放在一起,你會得到:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler


df = pd.DataFrame({'par1':[1,3,5,7,9, 11,13],
                   'par2':[0.2, 0.4, 0.5, 0.7, 1, 1.2, 1.45],
                   'par3':['yes', 'no', 'no', 'yes', 'no', 'yes', 'no'],
                   'par4':['blue', 'red', 'red', 'blue', 'green', 'green', 'blue'],
                   'output':[103, 310, 522, 711, 921, 1241, 1451]})

t = ColumnTransformer(transformers=[
    ('onehot', OneHotEncoder(), ['par3', 'par4']),
    ('scale', StandardScaler(), ['par1', 'par2'])
], remainder='passthrough')

# Transform the features
features = t.fit_transform(df.iloc[:,:-1])
result = df.iloc[:,-1]

# Train the linear regression model
reg = LinearRegression()
model = reg.fit(features, result)

# Generate a prediction
example = t.transform(pd.DataFrame([{
    'par1': 2, 'par2': 0.33, 'par3': 'no', 'par4': 'red'
}]))
prediction = model.predict(example)
reg_score = reg.score(features, result)
print(prediction, reg_score)

您問的是關於回歸的一般性問題,而不僅僅是關於 SciKit,所以我將嘗試籠統地回答。

您對是/否變量是正確的,您可以將它們編碼為二進制變量 0 和 1。但是,同樣的原則適用於 colors 和其他分類變量:

您創建n-1虛擬二進制變量, n是類別數。 每個虛擬變量基本上都在說明您的觀察是否屬於相應的類別。 您將其中之一(例如藍色)聲明為默認類別,並通過將所有虛擬變量設置為零來對其進行編碼。 即,如果它既不是紅色也不是綠色,也不是任何其他可用的顏色,它必須是藍色的。

其他類別通過將相應的虛擬變量設置為1並將所有其他類別設置為零來進行編碼。 因此,對於red ,您可以設置dummy1 = 1 ,對於green dummy2 = 1等。

二進制變量只是這種編碼的一個特例,你有兩個類別,你用 1 (= 2-1) 變量進行編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM