Python 是否有可能从集合votingclassifier中拟合出一个特定的估计器?

Python 是否有可能从集合votingclassifier中拟合出一个特定的估计器?,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,这是我的第一个问题,如果我做错了,请告诉我 因此,我使用sklearn构建了一个包含3种不同估计器的集成votingclassifier。 我首先调用:est.fit() 第一个数据集很小,因为三分之二的估计器拟合非常耗时 现在我想用不同的数据再次拟合第三个估计量有没有办法做到这一点? 我尝试这样访问估计器: ens.estimators[2].fit(X\u大数据,y\u大数据) 这不会产生错误,但我不确定这是否适合估计器的一个副本,或者实际上是集合的一部分现在之后调用ens.predict(

这是我的第一个问题,如果我做错了,请告诉我

因此,我使用sklearn构建了一个包含3种不同估计器的集成votingclassifier。 我首先调用:
est.fit()

第一个数据集很小,因为三分之二的估计器拟合非常耗时

现在我想用不同的数据再次拟合第三个估计量有没有办法做到这一点?

我尝试这样访问估计器:
ens.estimators[2].fit(X\u大数据,y\u大数据)

这不会产生错误,但我不确定这是否适合估计器的一个副本,或者实际上是集合的一部分
现在之后调用
ens.predict(X_测试)
会导致以下错误:(如果我不尝试拟合第三个估计器,predict工作正常)

ValueError回溯(最近一次调用)
在里面
---->1预测2=预测(X检验2)
2份打印(ens.分数(X_测试ens2,y_测试ens2))
3混淆矩阵(pred_ens2,y_test_ens2).ravel()
预测(self,X)中的~/jupyter/lexical/lexical\u env/lib/python3.7/site-packages/sklearn/employee//u voting.py
280检查是否已安装(自)
281如果self.voting=='soft':
-->282 maj=np.argmax(自预测概率(X),轴=1)
283
284其他:#“硬”投票
~/jupyter/lexical/lexical\u env/lib/python3.7/site-packages/sklearn/employee//u voting.py in\u predict\u proba(self,X)
300“在“软”投票中预测X的类别概率。”“”
301检查是否已安装(自身)
-->302平均值=np.平均值(自我收集概率X),轴=0,
303重量=自身。_重量_非_无)
304返回平均值
~/jupyter/lexical/lexical\u env/lib/python3.7/site-packages/sklearn/employee//u voting.py in\u collect\u probas(self,X)
295定义收集概率(自我,X):
296“从clf.predict调用收集结果”
-->297返回np.asarray([clf.predict_proba(X)用于自估计中的clf)
298
299定义预测概率(自我,X):
~/jupyter/lexical/lexical\u env/lib/python3.7/site-packages/sklearn/employee//u voting.py in(.0)
295定义收集概率(自我,X):
296“从clf.predict调用收集结果”
-->297返回np.asarray([clf.predict_proba(X)用于自估计中的clf)
298
299定义预测概率(自我,X):
~/jupyter/lexical/lexical_env/lib/python3.7/site-packages/sklearn/utils/metaestimators.py in(*args,**kwargs)
117
118#lambda(但不是部分)允许help()使用更新包装器
-->119 out=lambda*args,**kwargs:self.fn(obj,*args,**kwargs)
120#更新返回函数的docstring
121更新_包装器(out,self.fn)
预测概率中的~/jupyter/lexical/lexical\u env/lib/python3.7/site-packages/sklearn/pipeline.py(self,X)
461 Xt=X
462对于u,名称,自转换。\u iter(带_final=False):
-->463 Xt=transform.transform(Xt)
464返回自我。步骤[-1][-1]。预测概率(Xt)
465
变换中的~/jupyter/lexical/lexical\u env/lib/python3.7/site-packages/sklearn/compose//u column\u transformer.py(self,X)
596如果(n_cols_变换>=n_cols_拟合和
597任意(X列[:n_cols_fit]!=self.\u df_列]):
-->598 raise VALUE ERROR('列顺序必须相等才能匹配'
599'和使用'
600“余数关键字”)
ValueError:使用Requirement关键字时,fit和transform的列顺序必须相等


编辑:我修复了错误!这是因为小数据集的列数比大数据集的多。这可能是一个问题,因为当第一次使用小数据集拟合时,变压器被告知将有这些列(?)。一旦它们拥有相同的列(和列顺序),它就可以工作了。这似乎是只培训一个特定估计器的正确方法,但请告诉我是否有更好的方法,或者你认为我错了。

因此,似乎单个分类器存储在一个列表中,可以使用
.estimators\uu
访问。此列表的各个条目是具有
.fit
方法的分类器。因此,以逻辑回归为例:

from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import VotingClassifier

X1, y1 = make_classification(random_state=1)
X2, y2 = make_classification(random_state=2)


clf1 = LogisticRegression(random_state=1)
clf2 = LogisticRegression(random_state=2)
clf3 = LogisticRegression(random_state=3)


voting = VotingClassifier(estimators=[
    ('a', clf1),
    ('b', clf2),
    ('c', clf3),
])

# fit all
voting = voting.fit(X1,y1)

# fit individual one
voting.estimators_[-1].fit(X2,y2)
voting.predict(X2)
编辑:
估计数
估计数
.估计数 这是一个元组列表,其形式为(名称、估计器):

.估计数_ 这只是一个估计值列表,没有名称:

for e in voting.estimators_:
    print(e)

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=1, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=2, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=3, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)
有趣的是, 不过,

voting.estimators[0][1]==voting.estimators[0]
的计算结果为
False
,因此条目似乎不相同

投票分类器的预测方法使用
估计器列表


检查第295-323行

谢谢您的回答!是的,你是对的,我在最初的问题中已经提到了这个列表。但是你写答案的方式,这些信息要清楚得多。几分钟前我编辑了我的问题,添加了我是如何修复错误的。现在它就像一个符咒啊,你一定是在我写答案的时候编辑的^^^是的,但是如果其他人有过这个问题,你写答案的方式绝对值得!顺便问一下,你有没有发现投票.估计数和投票.估计数之间的区别?哇,你太棒了,非常感谢你查这个!这真的很奇怪,条目不一样。但现在我可以肯定地知道,我可以用估计器进行额外的训练_
for e in voting.estimators:
    print(e)

('a', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=1, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False))
('b', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=2, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False))
('c', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=3, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False))
for e in voting.estimators_:
    print(e)

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=1, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=2, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)
LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
                   intercept_scaling=1, l1_ratio=None, max_iter=100,
                   multi_class='warn', n_jobs=None, penalty='l2',
                   random_state=3, solver='warn', tol=0.0001, verbose=0,
                   warm_start=False)