【问题标题】:How to properly implement voting on decision tree bagging method with for loop?如何使用 for 循环正确实现对决策树装袋方法的投票?
【发布时间】:2019-04-12 16:57:09
【问题描述】:

我是 python 和机器学习的新手,我试图查看投票分类器的 skear 文档,老实说,我迷路了。

我已经在 for 循环中为决策树执行了 bagging,但是我被困在必须执行投票才能做出最终决定的地方 每个数据样本,然后计算最终结果的准确性。

我收到TypeError: zip argument #1 must support iteration

下面是我的代码

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.utils import resample


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.35, random_state=3)

predictions = []

for i in range(1,20):
bootstrap_size = int(0.8*len(X_train))
x_bag, y_bag = resample(X_train,y_train, n_samples = bootstrap_size , random_state=i , replace = True) 
Base_DecisionTree = DecisionTreeClassifier(random_state=3)
Base_DecisionTree.fit(x_bag, y_bag)
y_predict = Base_DecisionTree.predict(X_test)
accuracy = accuracy_score(y_test, y_predict)
predictions.append(accuracy)


from sklearn.ensemble import RandomForestClassifier, VotingClassifier
votingClass = VotingClassifier(predictions)
#print(votingClass)
votingClass.fit(X_train, y_train)
confidence = votingClass.score(X_test, y_test)
print('accuracy:',confidence)

【问题讨论】:

  • 你能指定哪一行代码产生了错误吗?我不熟悉 sklearn 的决策树库,但您确定您在函数中传递了正确的标签集: Base_DecisionTree.fit(bag, y_train) 吗?据我了解,袋子是原始火车的子集,而 y_train 是原始训练集的标签。我希望 y_train 也是与样本匹配的标签的子集。
  • @Roberto 很抱歉我粘贴了旧代码,很抱歉我已经更新了它。给我错误的行是votingClass.fit(X_train, y_train)
  • 别担心,感谢更新。我已经发布了答案

标签: python-3.x machine-learning decision-tree ensemble-learning


【解决方案1】:

根据我的理解,我查看了 VotingClassifier,该函数接受一组分类器,而在您的情况下,您提供了一个准确度列表。请从 sklearn (https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.VotingClassifier.html) 的文档中找到示例代码

import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, VotingClassifier

clf1 = LogisticRegression(solver='lbfgs', multi_class='multinomial',random_state=1)
clf2 = RandomForestClassifier(n_estimators=50, random_state=1)
clf3 = GaussianNB()

X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
y = np.array([1, 1, 1, 2, 2, 2])
eclf1 = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='hard')
eclf1 = eclf1.fit(X, y)
print(eclf1.predict(X))
#[1 1 1 2 2 2]
np.array_equal(eclf1.named_estimators_.lr.predict(X), eclf1.named_estimators_['lr'].predict(X))
#True
eclf2 = VotingClassifier(estimators=[ ('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='soft')
eclf2 = eclf2.fit(X, y)
print(eclf2.predict(X))
#[1 1 1 2 2 2]
 eclf3 = VotingClassifier(estimators=[ ('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='soft', weights=[2,1,1], flatten_transform=True)
eclf3 = eclf3.fit(X, y)
print(eclf3.predict(X))
#[1 1 1 2 2 2]
print(eclf3.transform(X).shape)
#(6, 6)

编辑

所以我认为 VotingClassifier 函数不是解决您的任务的正确途径。

你要做的是从你的 for 循环中收集所有的 y_predict。 这将为您提供每个样本的预测。

一旦对于每个样本(例如),您拥有所有预测(例如),您就可以计算投票。结果将是预测的最终标签 (= Vote())。

通过将投票预测的标签与基本事实进行比较来给出准确度。

【讨论】:

  • 我被要求做的事情似乎不符合文档。
  • 完成“for”循环后,您应该对测试集中的每个样本有 19 个不同的预测。然后,进行投票,根据所有 19 个分类器的投票,对每个数据样本做出最终决定。最后,计算并报告 Bagging(Voting)方法的最终准确性。注意:您不需要在循环的每一轮中计算每个基分类器的准确度!您只需执行投票即可对每个数据样本做出最终决定,然后计算最终结果的准确性
  • 是的,但是在你的代码中,在 for 循环中,你有: : "注意:你不需要在每一轮循环中计算每个基分类器的准确率!你只需对每个数据样本进行投票做出最终决定,然后计算最终的准确率结果”。
猜你喜欢
  • 2019-04-12
  • 2023-01-01
  • 2021-12-02
  • 2016-11-22
  • 2016-09-02
  • 2012-07-09
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多