我用python编写了一个程序,使用机器学习算法对数据进行预测。我使用Scikit学习中的函数RandomForestClassifier来创建一个随机森林来进行预测。
该程序的目的是预测未知的天体物理源是脉冲星还是agn;因此它在已知数据上训练森林,然后对未知数据进行预测,但它不起作用。该程序预测未知数据都是脉冲星或全agn,它很少预测不同的结果,但并不正确。
下面我将描述我的程序的段落。
它创建了一个包含所有源数据的数据框: all_df它由十列组成,其中九列用作预测,一列用作目标:
predictors=all_df[['spec_index','variab_index','flux_density','unc_ene_flux100','sign_curve','h_ratio_12','h_ratio_23','h_ratio_34','h_ratio_45']]
targets=all_df['type']type列包含每个震源的标签“pulsar”或“agn”。
在程序中连续使用预测器和目标值来训练森林。
该程序使用Scikit Learn中的函数train_test_split将预测因子和目标划分为两组,训练和测试分别占总数的70%和30%:
pred_train, pred_test, tar_train, tar_test=train_test_split(predictors, targets, test_size=0.3)这些集合中的数据是混合的,因此程序会对这些集合的索引进行排序,而不会更改数据位置:
pred_train=pred_train.reset_index(drop=True)
pred_test=pred_test.reset_index(drop=True)
tar_train=tar_train.reset_index(drop=True)
tar_test=tar_test.reset_index(drop=True)在此之后,程序创建并训练随机森林:
clf=RandomForestClassifier(n_estimators=1000,oob_score=True,max_features=None,max_depth=None,criterion='gini')#,random_state=1)
clf=clf.fit(pred_train,tar_train)现在,程序对测试集进行预测:
predictions=clf.predict(pred_test) 在这一点上,程序似乎起作用了。
现在,它将另一个包含未知数据的数据帧传递给上面创建的森林,我得到了前面描述的坏结果。你能帮帮我吗?这个问题可能是随机森林分类器中的偏移量,但我没有得到修改随机森林分类器选项的有意义的结果。如果你需要,我可以给你进一步的解释。提前谢谢。
再见,法比奥
PS:我也尝试了交叉验证:我将训练集分为训练集和测试集,以相同的比例(0.7和0.3)再次创建、训练和测试森林,然后在初始测试集上进行测试,修改随机森林分类器选项以获得更好的结果,但我没有任何改进。
发布于 2016-08-22 01:29:24
谢谢你们的回复,伙计们。
正如所建议的那样,我在“测试”数据和“未知”数据中绘制了预测因子的曲线图;分布通常是相似的,但我更喜欢用直方图来表示。所以我试着做直方图,但我不能同时针对测试和未知数据,使用:
pylab.hist(unid_df.spec_index,bins=30)我获得了: TypeError: len() of unsized
我还没有找到解决方案,我不知道这个错误是否会对预测产生负面影响。
补充信息:各种预测因子的范围不同。测试和未知数据的相应预测器的范围是相同的,但在少数情况下,测试数据范围比未知数据的相应预测器具有更大的数量级。这是由于某些点的值比集合中的大多数其他点大得多。
再次感谢。再见,法比奥
https://stackoverflow.com/questions/39007386
复制相似问题