【问题标题】:Random forest algorithm not working for new datasets随机森林算法不适用于新数据集
【发布时间】:2019-02-12 16:59:29
【问题描述】:

我在 python 中使用随机森林算法来训练我的数据集1,我得到了 99% 的准确率。但是当我尝试使用新的 dataset2 来预测值时,我得到了错误的值。我手动检查了新数据集的结果,当我与预测结果进行比较时,准确率非常低。

下面是我的代码:

   from IPython import get_ipython
   get_ipython().run_line_magic('matplotlib', 'inline')

   import numpy as np
   import pandas as pd
   import matplotlib.pyplot as plt
   plt.rcParams['figure.figsize']=(20.0,10.0)

   data = pd.read_csv('D:/Users/v477sjp/lpthw/Extract.csv', usecols=['CON_ID', 
   'CON_LEGACY_ID', 'CON_CREATE_TD',
   'CON_CREATE_LT', 'BUL_CSYS_ID_ORIG', 'BUL_CSYS_ID_CORIG',
   'BUL_CSYS_ID_DEST', 'BUL_CSYS_ID_CLEAR', 'TOP_ID', 'CON_DG_IN', 
   'PTP_ID', 'SMO_ID_1',
   'SMO_ID_8', 'LOB_ID', 'PRG_ID', 'PSG_ID', 'SMP_ID', 'COU_ISO_ID_ORIG',
   'COU_ISO_ID_DEST', 'CON_DELIV_DUE_DT', 'CON_DELIV_DUE_LT',
   'CON_POSTPONED_DT', 'CON_DELIV_PLAN_DT', 'CON_INTL_IN', 'PCE_NR',
   'CON_TC_PCE_QT', 'CON_TC_GRS_WT', 'CON_TC_VL', 'PCE_OC_LN', 
   'PCE_OC_WD','PCE_OC_HT', 'PCE_OC_VL', 'PCE_OC_WT', 'PCE_OA_LN', 
   'PCE_OA_WD','PCE_OA_HT', 'PCE_OA_VL', 'PCE_OA_WT', 'COS_EVENT_TD', 
   'COS_EVENT_LT',
   '((XSF_ID||XSS_ID)||XSG_ID)', 'BUL_CSYS_ID_OCC',  
   'PCE_NR.1', 'PCS_EVENT_TD', 'PCS_EVENT_LT',
   '((XSF_ID||XSS_ID)||XSG_ID).1', 'BUL_CSYS_ID_OCC.1', 
   'BUL_CSYS_ID_1', 'BUL_CSYS_ID_2', 'BUL_CSYS_ID_3',
   'BUL_CSYS_ID_4', 'BUL_CSYS_ID_5', 'BUL_CSYS_ID_6', 'BUL_CSYS_ID_7',
   'BUL_CSYS_ID_8', 'BUL_CSYS_ID_9', 'BUL_CSYS_ID_10', 'BUL_CSYS_ID_11',
   'BUL_CSYS_ID_12', 'BUL_CSYS_ID_13', 'BUL_CSYS_ID_14', 
   'BUL_CSYS_ID_15',
   'BUL_CSYS_ID_16', 'CON_TOT_SECT_NR', 'DELAY'] ) 

df = pd.DataFrame(data.values ,columns=data.columns)
for col_name in df.columns:

if(df[col_name].dtype == 'object' and col_name != 'DELAY'):
    df[col_name]= df[col_name].astype('category')
    df[col_name] = df[col_name].cat.codes

   target_attribute = df['DELAY']
   input_attribute=df.loc[:,'CON_ID':'CON_TOT_SECT_NR']

   from sklearn.model_selection import train_test_split
   X_train, X_test, y_train, y_test =               train_test_split(input_attribute,target_attribute, test_size=0.3)

   from sklearn.ensemble import RandomForestRegressor
   rf = RandomForestRegressor(n_estimators = 1000, random_state = 42)
   rf.fit(X_train, y_train);

   predictions = rf.predict(X_test)

   errors = abs(predictions - y_test)
   print(errors)

   print('Mean Absolute Error:', round(np.mean(errors), 2), 'result.')

   mape = 100 * (errors / y_test)

   accuracy = 100 - np.mean(mape)
   print('Accuracy:', round(accuracy, 2), '%.')

   data_new = pd.read_csv('D:/Users/v477sjp/lpthw/Extract-0401-              TestCurrentData-Null.csv', usecols=['CON_ID','CON_LEGACY_ID','CON_CREATE_TD','CON_CREATE_LT','BUL_CSYS_ID_ORIG',       'BUL_CSYS_ID_CORIG','BUL_CSYS_ID_DEST','BUL_CSYS_ID_CLEAR','TOP_ID', 
   'CON_DG_N', 'PTP_ID', 'SMO_ID_1',
   'SMO_ID_8', 'LOB_ID', 'PRG_ID', 'PSG_ID', 'SMP_ID', 'COU_ISO_ID_ORIG',
   'COU_ISO_ID_DEST', 'CON_DELIV_DUE_DT', 'CON_DELIV_DUE_LT',
   'CON_POSTPONED_DT', 'CON_DELIV_PLAN_DT', 'CON_INTL_IN', 'PCE_NR',
   'CON_TC_PCE_QT', 'CON_TC_GRS_WT', 'CON_TC_VL','PCE_OC_LN','PCE_OC_WD',
   'PCE_OC_HT', 'PCE_OC_VL', 'PCE_OC_WT', 'PCE_OA_LN', 'PCE_OA_WD',
   'PCE_OA_HT', 'PCE_OA_VL', 'PCE_OA_WT', 'COS_EVENT_TD', 'COS_EVENT_LT',
   '((XSF_ID||XSS_ID)||XSG_ID)', 'BUL_CSYS_ID_OCC',  
   'PCE_NR.1','PCS_EVENT_TD', 'PCS_EVENT_LT',
   '((XSF_ID||XSS_ID)||XSG_ID).1', 'BUL_CSYS_ID_OCC.1', 
   'BUL_CSYS_ID_1', 'BUL_CSYS_ID_2', 'BUL_CSYS_ID_3',
   'BUL_CSYS_ID_4', 'BUL_CSYS_ID_5', 'BUL_CSYS_ID_6', 'BUL_CSYS_ID_7',
   'BUL_CSYS_ID_8', 'BUL_CSYS_ID_9', 'BUL_CSYS_ID_10', 'BUL_CSYS_ID_11',
   'BUL_CSYS_ID_12', 'BUL_CSYS_ID_13', 'BUL_CSYS_ID_14','BUL_CSYS_ID_15',
   'BUL_CSYS_ID_16', 'CON_TOT_SECT_NR', 'DELAY'] ) 

   df_new = pd.DataFrame(data_new.values ,columns=data_new.columns)
   for col_name in df_new.columns:
       if(df_new[col_name].dtype == 'object' and col_name != 'DELAY' ):
           df_new[col_name]= df_new[col_name].astype('category')
           df_new[col_name] = df_new[col_name].cat.codes
   X_test_new=df_new.loc[:,'CON_ID':'CON_TOT_SECT_NR']
   y_pred_new = rf.predict(X_test_new)
   df_new['Delay_1']=y_pred_new
   df_new.to_csv('prediction_new.csv')

新数据集的预测结果错误,准确率很低。数据准确率为 99%。我应该得到新数据集的负面结果。但我得到的所有价值观都是积极的。请帮忙

【问题讨论】:

    标签: python machine-learning random-forest


    【解决方案1】:

    似乎该算法对训练数据集过度拟合。一些可以尝试的选项是
    1) 使用更大的数据集
    2) 减少特征/列或做一些特征工程
    3) 使用正则化
    4) 如果数据集不是太大,请尝试在随机森林的情况下减少估计器的数量。
    5) 使用其他参数,如 max_features、max_depth、min_samples_split、min_samples_leaf

    希望对你有帮助

    【讨论】:

    • 非常感谢。我还有一个澄清。如果算法没有用负值训练,那么它会预测新数据集的负值吗?我使用了一个包含 1000 条记录的数据集来训练算法,新数据集包含 1000 条记录。
    • 这是一个“非代表性训练数据”的例子。使用代表您将来要概括的案例的训练集至关重要。您应该确保您的训练数据集包含代表未来新数据集的示例。
    猜你喜欢
    • 2016-04-04
    • 2021-03-13
    • 2015-02-12
    • 2012-04-19
    • 2021-07-06
    • 2016-07-05
    • 2020-03-14
    • 2021-06-01
    • 2021-07-23
    相关资源
    最近更新 更多