【问题标题】:troubleshooting random forests classifier in sci-kit learn在 scikit learn 中对随机森林分类器进行故障排除
【发布时间】:2014-03-24 16:23:06
【问题描述】:

我正在尝试从 sci-kit learn 运行随机森林分类器,并得到可疑的错误输出 - 不到 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])

【问题讨论】:

  • 您是否将电子表格作为 train_file 输入到这一行中的矢量化:X_train = vectorizer.fit_transform(train_file) ?如果是这种情况,那么您的矢量化文件会将您的文件视为单个文本文件并计算该文件中的单词。如果您将输入作为电子表格,那么您不应该使用 CountVectorizer,因为您已经有了字数统计,您应该将该电子表格读入矩阵
  • @Shahram,X_train 本质上是一个字符串列表,每个字符串都包含电子表格中特定行中的所有单词。字符串 1 包含第 1 行中的单词,依此类推。所以我认为矢量化器对于创建单词出现是必要的。我检查了 CountVectorizer 的输出是什么样的,我认为那部分是正确的。不过,我会澄清这一点。

标签: python scikit-learn random-forest


【解决方案1】:

如果使用随机森林 (RF),您在训练集 X_train 上的表现如此糟糕,那么肯定是有问题,因为您应该得到很大的百分比,超过 90%。 试试下面的(代码 sn-p 先):

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 learn中的界面基本都是一样的,看看他们的表现如何(也许RF真的不是最好的)。见上面的代码
  2. 尝试创建一些随机生成的数据集以提供给 RF 分类器,我强烈怀疑生成 vectorizer 对象的映射过程出现问题。因此,开始创建您的 X_train 并查看。

希望有帮助

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 2017-08-25
    • 2017-05-22
    • 2014-07-30
    • 2013-04-26
    • 2014-03-25
    • 2015-02-21
    • 2015-09-16
    • 2016-06-22
    相关资源
    最近更新 更多