簡體   English   中英

如何順序鏈接 ML 模型/管道模型?

[英]How to chain ML models/pipeline models sequentially?


前提:
我一直在研究這個 ML 數據集,我發現我的 ADA boost 和 SVM 在檢測 TP 方面非常出色。 兩種模型的混淆矩陣如下所示。
這是圖像:
支持向量機混淆矩陣

在我訓練的 10 個模型中,有 2 個是 ADA 和 SVM。 其他 8 個,一些精度較低,另一些精度高 ~+-2%

主要問題:

如何鏈接/管道以便我的所有測試用例都以下列方式處理?

  1. 通過 SVM 和 ADA 傳遞所有案例。 如果 SVM 或 ADA 的置信度為 80%+,則返回結果
  2. 否則,如果 SVM 或 ADA 的置信度不高,則僅將其他 8 個模型評估的那些測試用例作為最終決定

潛在解決方案:
我的潛在嘗試涉及使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM