[英]How do I properly fit a sci-kit learn model using a pandas dataframe?
[英]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.