2017-07-30 41 views
1

我有100萬點的記錄訓練集和測試集的100爲了創建一個推薦系統,我已經創建了組織爲這樣的兩個dataframes:熱編碼:缺少列

[in]print(training_df.head(n=5)) 

[out]      product_id 
transaction_id      
0000001     [P06, P09] 
0000002   [P01, P05, P06, P09] 
0000003     [P01, P06] 
0000004     [P01, P09] 
0000005     [P06, P09] 

我然後使用sklearn創建一個矩陣,其中product_id是列,transaction_id是行(索引)。

下面是代碼:

# Create a matrix for the transactions 
from sklearn.preprocessing import MultiLabelBinarizer 

mlb = MultiLabelBinarizer() 
training_df1 = training_df.join(pd.DataFrame(mlb.fit_transform(training_df.pop('product_id')), 
          columns=mlb.classes_, 
          index=training_df.index)) 

的PRODUCT_ID的是P01-P10。問題是訓練數據中缺少P04和P08,所以我的training_df1只有8個而不是10個。我怎樣才能添加這兩列並在所有事務中填入0?

回答

2

您可以初始化MultiLabelBinarizer當通過預定義的產品的IDS P01-P10如類,因而輸出將始終包括這些類別爲列:

from sklearn.preprocessing import MultiLabelBinarizer 
​ 
product_ids = ['P{:02d}'.format(i+1) for i in range(10)] 
print(product_ids) 
# ['P01', 'P02', 'P03', 'P04', 'P05', 'P06', 'P07', 'P08', 'P09', 'P10'] 
​ 
mlb = MultiLabelBinarizer(classes=product_ids) 
training_df.join(pd.DataFrame(mlb.fit_transform(training_df['product_id']), 
           columns=mlb.classes_, 
           index=training_df.index)) 

enter image description here


要獲得矩陣僅返回:

training_df.drop('product_id', 1).join(
    pd.DataFrame(mlb.fit_transform(training_df['product_id']), columns=mlb.classes_, index=training_df.index) 
) 

enter image description here

+0

我得到'code'(Key Error:'product_id')。此外,我不想返回'product_id'列,只有矩陣。 – zsad512

+1

很可能你已經用'pop'方法從'training_df'彈出'product_id'列,我不推薦使用它,因爲它修改'training_df'並給你這樣的問題。所以試着重建它。另外,你需要'transaction_id'列,還是隻需要P01-P10? – Psidom

+0

好的,我認爲你是對的,我會重建df並再次嘗試 - 但是,保留transaction_id列會很有幫助,但是包含product_id列會因爲數據已經存在而變得有點冗餘。 – zsad512