在sci-kit中对随机森林分类器进行故障排除

时间:2014-02-23 02:40:28

标签: python scikit-learn random-forest

我正在尝试从sci-kit中运行随机森林分类器学习并获得可疑的错误输出 - 不到1%的预测是正确的。该模型的表现远比偶然。我相对较新的Python,ML和sci-kit学习(三重打击),我担心的是我缺少一些基本的东西,而不是需要微调参数。我希望的是更有经验的眼睛来查看代码并查看设置是否有问题。

我正在尝试根据单词出现来预测电子表格中行的类 - 因此每行的输入是一个数组,表示每个单词出现的次数,例如[1 0 0 2 0 ... 1]。我正在使用sci-kit learn的CountVectorizer进行此处理 - 我将其包含在每行中包含单词的字符串中,并输出单词出现数组。如果这个输入由于某种原因不合适,那可能是出现问题的地方,但我没有在网上找到任何内容,或者在文档中发现了这种情况。

现在,森林正在大约0.5%的时间正确回答。使用与SGD分类器完全相同的输入产生接近80%,这表明我正在进行的预处理和矢量化很好 - 这是RF分类器特有的。我的第一反应是寻找过度拟合,但即使我在 training 数据上运行模型,它仍然几乎所有错误。

我玩过很多树木和训练数据,但对我来说这似乎没什么变化。我试图只显示相关代码,但如果有用,可以发布更多代码。第一篇SO帖子,所有的想法和反馈都很受欢迎。

#pull in package to create word occurence vectors for each line
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(min_df=1,charset_error='ignore')
X_train = vectorizer.fit_transform(train_file)
#convert to dense array, the required input type for random forest classifier
X_train = X_train.todense()

#pull in random forest classifier and train on data
from sklearn.ensemble import RandomForestClassifier
clf = RandomForestClassifier(n_estimators = 100, compute_importances=True)
clf = clf.fit(X_train, train_targets)

#transform the test data into the vector format
testdata = vectorizer.transform(test_file)
testdata = testdata.todense()


#export
with open('output.csv', 'wb') as csvfile:
    spamwriter = csv.writer(csvfile)
    for item in clf.predict(testdata):
        spamwriter.writerow([item])

1 个答案:

答案 0 :(得分:1)

如果随机森林(RF)你在训练集X_train上变得如此糟糕,那么肯定是错误的,因为你应该获得超过90%的巨大百分比。 请尝试以下(首先是代码段):

print "K-means" 
clf  = KMeans(n_clusters=len(train_targets), n_init=1000, n_jobs=2)

print "Gaussian Mixtures: full covariance"
covar_type = 'full'    # 'spherical', 'diag', 'tied', 'full'     
clf = GMM(n_components=len(train_targets), covariance_type=covar_type, init_params='wc', n_iter=10000)

print "VBGMM: full covariance"
covar_type = 'full'    # 'spherical', 'diag', 'tied', 'full'     
clf = VBGMM(n_components=len(train_targets), covariance_type=covar_type, alpha=1.0, random_state=None, thresh=0.01, verbose=False, min_covar=None, n_iter=1000000, params='wc', init_params='wc')

print "Random Forest"
clf = RandomForestClassifier(n_estimators=400, criterion='entropy', n_jobs=2)

print "MultiNomial Logistic Regression"
clf = LogisticRegression(penalty='l2', dual=False, C=1.0, fit_intercept=True, intercept_scaling=1, tol=0.0001)

print "SVM: Gaussian Kernel, infty iterations"
clf = SVC(C=1.0, kernel='rbf', degree=3, gamma=3.0, coef0=1.0, shrinking=True,
probability=False, tol=0.001, cache_size=200, class_weight=None, 
verbose=False, max_iter=-1, random_state=None)
  1. 不同的分类器,sci-kit学习中的界面基本上是一样的,看看它们的行为方式(可能RF并不是最好的)。见上面的代码
  2. 尝试创建一些随机生成的数据集以提供给RF分类器,我强烈怀疑在生成vectorizer对象的映射过程中出现了问题。因此,请开始创建X_train并查看。
  3. 希望有所帮助