正如标题所述,我正在测试Python的MultiOutputClassifier,以解决一个需要根据3个输入确定坐标(x,y)输出的问题,但它只返回最接近的已学习值,而不是’外推’的值。
我的样本代码如下:
import numpy as npfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.multioutput import MultiOutputClassifiertrain_data = np.array([[-30,-60,-90,0,0],[-50,-50,-50,10,0],[-90,-60,-30,20,0],[-50,-50,-95,0,10],[-60,-30,-60,10,10],[-95,-50,-50,20,10],])# 这些数据是我随意编造的test_data_x = np.array([ [-35,-50,-90],])x = train_data[:, :3]y = train_data[:, 3:]forest = RandomForestClassifier(n_estimators=100, random_state=1)classifier = MultiOutputClassifier(forest, n_jobs=-1)classifier.fit(x,y)print classifier.predict(test_data_x)
这返回了0,10,但对于给定的输入,我期望输出应该是5,5;介于两个已学习值之间。
我觉得自己做错了什么或者是误解了。关于这个问题有任何帮助吗?MultiOutputClassifier是不是不适合这个任务?
回答:
这里的问题是(随机森林)分类器不会进行外推。它只能输出它已经见过的值。你可能需要使用回归器。
将你的代码中的”Classifier”替换为”Regressor”后,输出为(0.8, 5.8),这似乎更接近你的期望。
import numpy as npfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.multioutput import MultiOutputRegressortrain_data = np.array([ [-30,-60,-90,0,0], [-50,-50,-50,10,0], [-90,-60,-30,20,0], [-50,-50,-95,0,10], [-60,-30,-60,10,10], [-95,-50,-50,20,10],])test_data_x = np.array([ [-35,-50,-90],])x = train_data[:, :3]y = train_data[:, 3:]forest = RandomForestRegressor(n_estimators=100, random_state=1)classifier = MultiOutputRegressor(forest, n_jobs=-1)classifier.fit(x,y)print(classifier.predict(test_data_x))