我是python和机器学习的新手,我曾尝试查看sklear文档中的投票分类器,但很遗憾,我被机器人迷了。
我已经为for循环内的决策树执行了装袋工作,但是我被困在必须执行投票才能做出最终决定的地方 每个数据样本,然后计算最终结果的准确性。
我得到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)
答案 0 :(得分: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。 这将为您提供每个样本的预测。
一旦对每个样本(例如)有了所有预测(例如),就可以计算投票。结果将是预测的最终标签( =投票())。
将通过投票预测的标签与基本事实进行比较可以得出准确性。