2017-07-31 105 views
0

爲了讓我的XGBoost模型能夠從文本中預測文章的參與時間,我正在苦苦掙扎。首先,我得到代表我從文章中這樣提取的特徵數據框:XGBoost:功能名稱不匹配

article_features = pd.concat([tfidf_df, numeric_df_normalized], axis=1) 

然後我訓練我的模型,並得到相關的正確列(功能):

with open('correct_columns') as fp: 
     correct_columns = pickle.load(fp) 

然後我經過所有必需的功能,並將其設置爲0.0如果他們不已經在article_features

for col in correct_columns: 
     if col not in article_features.columns: 
      article_features[col] = 0.0 

最後,我刪除了爲Extrac功能泰德從這篇文章沒有訓練數據存在:

for col in article_features: 
    if col not in correct_columns: 
     del article_features[col] 

所以現在article_features具有的特點正確的號碼。我嘗試運行:

model.predict(article_features) 

我也得到:

ValueError: feature_names mismatch:... 

所以我谷歌並嘗試我的數據幀轉換爲:

model.predict(article_features.as_matrix()) 

,但我得到了同樣的錯誤。

article_features.sort_index(axis=1, inplace=True) 

,但得到了同樣的錯誤:

一樣correct_columns所以我做了我當時在article_features不是擔心列的順序。

任何想法如何解決?

謝謝!

+0

你是如何訓練'model'?我的意思是哪些功能在那裏被使用?確切地說,這些特徵應該在預測期間存在,否則就沒有任何意義。 –

回答

0

這個想法是,您用來擬合模型的數據包含與您用來訓練模型的數據完全相同的特徵。

最後,我刪除這篇文章不 在訓練中存在的數據中提取的特徵: .... 所以現在article_features具有的特點正確的號碼。 ...

那些用於擬合模型的數據中存在的特徵如何,而不是用於訓練的數據?

0

由於DMatrix..num_col()只返回稀疏矩陣中非零列的數量,所以發生該問題。因此,如果兩列&測試數據具有相同數量的非零列,則一切正常。否則,您將得到不同的功能名稱列表。還有就是目前有三個解決方案,以解決此問題:

  1. 重新調整列車數據幀和數據幀測試的列名中使用

    test_df = test_df[train_df.columns] 
    
  2. 先保存模型,然後加載模型

  3. use test_df.values 
    
  4. 送入模型之前改變測試數據到陣列

    代替

    test_df