[英]How to chain ML models/pipeline models sequentially?
前提:
我一直在研究這個 ML 數據集,我發現我的 ADA boost 和 SVM 在檢測 TP 方面非常出色。 兩種模型的混淆矩陣如下所示。
這是圖像:
在我訓練的 10 個模型中,有 2 個是 ADA 和 SVM。 其他 8 個,一些精度較低,另一些精度高 ~+-2%
主要問題:
如何鏈接/管道以便我的所有測試用例都以下列方式處理?
潛在解決方案:
我的潛在嘗試涉及使用 2 個投票分類器。 一個分類器只有 ADA 和 SVM,第二個分類器有其他 8 個模型。 但我不知道如何做這項工作
這是我的方法的代碼:
from sklearn.ensemble import VotingClassifier
ensemble1=VotingClassifier(estimators=[
('SVM',model[5]),
('ADA',model[7]),
], voting='hard').fit(X_train,Y_train)
print('The accuracy for ensembled model is:',ensemble1.score(X_test, Y_test))
#I was trying to make ensemble 1 the "first pass" if it was more than 80% confident in it's decision, return the result
#ELSE, ensemble 2 jumps in to make a decision
ensemble2=VotingClassifier(estimators=[
('LR',model[0]),
('DT',model[1]),
('RFC',model[2]),
('KNN',model[3]),
('GBB',model[4]),
('MLP',model[6]),
('EXT',model[8]),
('XG',model[9])
], voting='hard').fit(X_train,Y_train)
#I don't know how to make these two models work together though.
額外問題:
這些問題是為了幫助我解決一些額外的問題,而不是主要問題:
我正在努力做的事情值得嗎?
有一個只有真陽性和假陽性的混淆矩陣是否正常? 或者這是否表明訓練不正確? 如上圖 Model 5 所示。
對不起,很長的帖子,感謝您的所有意見和建議。 我是 ML 的新手,所以我會很感激任何指示。
這是一個簡單的實現,有望解決鏈接多個估算器的主要問題:
class ChainEstimator(BaseEstimator,ClassifierMixin):
def __init__(self,est1,est2):
self.est1 = est1
self.est2 = est2
def fit(self,X,y):
self.est1.fit(X,y)
self.est2.fit(X,y)
return self
def predict(self,X):
ans = np.zeros((len(X),)) - 1
probs = self.est1.predict_proba(X) #averaging confidence of Ada & SVC
conf_samples = np.any(probs>=.8,axis=1) #samples with >80% confidence
ans[conf_samples] = np.argmax(probs[conf_samples,:],axis=1) #Predicted Classes of confident samples
if conf_samples.sum()<len(X): #Use est2 for non-confident samples
ans[~conf_samples] = self.est2.predict(X[~conf_samples])
return ans
你可以這樣稱呼它:
est1 = VotingClassifier(estimators=[('ada',AdaBoostClassifier()),('svm',SVC(probability=True))],voting='soft')
est2 = VotingClassifier(estimators=[('dt',DecisionTreeClassifier()),('knn',KNeighborsClassifier())])
clf = ChainEstimator(est1,est2).fit(X_train,Y_train)
ans = clf.predict(X_test)
現在,如果您想基於est1
的性能進行鏈接,您可以執行以下操作來記錄其在訓練期間的性能,並在predict
function 上添加更多if
s:
def fit(self,X,y):
self.est1.fit(X,y)
self.est1_perf = cross_val_score(self.est1,X,y,cv=4,scoring='f1_macro')
self.est2.fit(X,y)
self.est2_perf = cross_val_score(self.est2,X,y,cv=4,scoring='f1_macro')
return self
請注意,您不應該對此類問題使用簡單的准確性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.