差分進化算法優化集成參數


一、差分進化的思想

  差分進化是在遺傳算法的基礎上發展而來的,與遺傳算法相似,有變異、交叉、選擇等操作,但是實現簡單,收斂速度快。差分進化的過程是隨機生成一個初始化群體,經過交叉、變異、選擇三個操作,反復迭代,保留有用的個體,尋找最優解。

  差分進化利用了貪婪的思想,在每一次的迭代中,保留最優解。通過當前種群個體跟經過交叉、變異后的個體以適應度值為標准,進行比較,保留最優的個體。

(1)初始化

(2)變異

(3)交叉

(4)選擇

  其中,F是變異因子,用來控制兩個隨機個體差分向量的縮放程度。CR是交叉概率,用來控制進化發生的幾率,CR的值越大,則變異個體對試驗個體的貢獻多,CR的值小,則種群個體對試驗個體的貢獻多。

差分進化算法描述:

 

二、差分進化優化集成參數

  差分進化算法優化參數時,關鍵是適應度值的計算,初始化、變異、交叉操作,是以種群個體為操作對象,代碼實現可以通用,適應度值的計算需要考慮優化的目標。

  利用集成學習的方法,選擇五種分類器,把每個分類器權重作為差分進化中的種群個體,作為被優化的對象,這樣每個個體的維度就是5,一個個體就是一個解向量。

  計算適應度值:分別將當代種群個體和經過變異、交叉操作后得到的試驗個體的分量作為個體分類器的權重,在數據集上通過加權集成分類結果,得到所有樣本的輸出,計算分類准確率,將其作為適應度值。

適應度值計算:

def fitness(w):      #計算適應度值函數
    trainX, Y_train, testX, Y_test = classifier.feature_sec()
    predict = []
    m = classifier.Y_test.shape[0]
    #for Xi in model.testX:
    clf1 = classifier.clfLR(trainX, Y_train, testX, Y_test)
    clf2 = classifier.clfLDA(trainX, Y_train, testX, Y_test)
    clf3 = classifier.clfNB(trainX, Y_train, testX, Y_test)
    clf4 = classifier.clfSVM(trainX, Y_train, testX, Y_test)
    clf5 = classifier.clfPLA(trainX, Y_train, testX, Y_test)
    f1 = np.array(clf1.predict_proba(testX))
    f2 = np.array(clf2.predict_proba(testX))
    f3 = np.array(clf3.predict_proba(testX))
    f4 = np.array(clf4.predict_proba(testX))
    f5 = np.array(clf5._predict_proba_lr(testX))
    fit = w[0]*f1 + w[1]*f2 + w[2]*f3 + w[3]*f4 + w[4]*f5
    # print("f1",f1)
    # print("fit:",fit)
    # s = 0.5 * sum(w)
    print("w,s:",w)
    # for i in range(m):
    #     fit = w[0]*f1[i] + w[1]*f2[i] + w[2]*f3[i] + w[3]*f4[i]
    #     if fit >= s:
    #         predict.append(1)
    #     else:
    #         predict.append(0)
    for fitprob in fit:
        if fitprob[0]>fitprob[1]:
            predict.append(0)
        else:
            predict.append(1)
    #print("predict:",predict)

    #print("Ytest shape:",classifier.Y_test.shape)
    # TP=TN=FP=FN = 0

    # print(m)
    # for k in range(m):
    #     if Y_test[k]==1 and predict[k]==1:TP += 1
    #     elif Y_test[k]==0 and predict[k]==0: TN += 1
    #     elif Y_test[k]==0 and predict[k]==1:FP += 1
    #     elif Y_test[k]==1 and predict[k]==0:FN += 1

    # TP = sum(classifier.Y_test == predict == 1)       #將正類預測為正類的樣本數
    # TN = sum(classifier.Y_test == predict == 0)       #將負類預測為負類的樣本數
    # FP = sum(classifier.Y_test == 0 and predict == 1)       #將負類預測為正類的樣本數
    # FN = sum(classifier.Y_test == 1 and predict == 0)       #將正類預測為負類的樣本數
    # F1 = 2*TP/(2*TP+FN+FP)       #F值越大,說明實驗效果越好
    #Gmean = math.sqrt((TP/(TP+FN))*(TN/(TN+FP)))        #用G-mean評價分類器性能
    count = sum(predict==Y_test)
    print("Accuracy,F1 is:",count/m)
    return count/m
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM