簡體   English   中英

如何在sci-kit學習模型中應對變化的基數

[英]How to deal with changing cardinality in sci-kit learn model

我正在嘗試在sci-kit學習模型中使用高基數功能(siteid),並且正在使用get_dummies對該功能進行一次熱編碼。 我得到了大約800個新的二進制列,這些列使用邏輯回歸返回了不錯的准確性。 我的問題是,當我通過模型傳遞新的數據集時,該功能具有不同的基數,例如300個唯一值,並且模型正確地問,您在哪個方面訓練了我的其他500列? 我該如何解決?

我不想每次基數變化時都必須訓練模型,也不想在SQL數據加載中對這些列進行硬編碼。

cat_columns = ["siteid"]

df = pd.get_dummies(df, prefix_sep="__",
                              columns=cat_columns)

我的建議是用零填充這些剩余的列。 因此,如果您的新訓練樣本具有例如10個唯一值,並且該模型期望有50個值( total_cols數量),則在右側創建40個零列以“填充”其余數據:

df = pd.DataFrame({"siteid": range(10)})
cat_columns = ["siteid"]
df1 = pd.get_dummies(df, columns=cat_columns)

# df1 has shape (10, 10)

total_cols = 50    # Number of columns that model expects
zero_padding = pd.DataFrame(np.zeros((df1.shape[0], total_cols - df1.shape[1])))
df = pd.concat([df1, zero_padding], axis=1)
df.columns = ["siteid__" + str(i) for i in range(df.shape[1])]

# df now has shape (10, 50)

我建議使用scikit-learn的OneHotEncoder。

這里的文件

在您的情況下,用法看起來像

from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(df[['cat_columns']])

categories = [cat for cats in enc.categories_ for cat in cats]

df[categories] = enc.transform(df[['cat_columns']])

handle_unknown參數是關鍵,而enc對象對於新數據的可重復性是必需的。

在新的數據框上,您將運行

df_new[categories] = enc.transform(df_new[['cat_columns']])

這將對相同的類別進行熱編碼,並忽略您的模型不習慣的任何新類別。

暫無
暫無

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

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