回覆列表
  • 1 # 哎呦658

    演算法原理整合學習(ensemble leaning)透過構建並結合多個學習器來完成學習任務,透過將多個學習器結合,常常可以獲得比單一學習器顯著優越的效果和泛化能力。整合學習中的基學習器可以是同質的,也可以是異質的。根據個體學習器的生成方式,目前的整合學習方法大致可分為三大類:一類是Bagging,個體學習器之間不存在強依賴關係,可以同時並行化訓練和生成,最終結果通常透過投票機制產出,隨機森林是這一型別的代表;另一類是Boosting,個體學習器之間存在強依賴關係,後一學習器依賴前一學習器的結果,,因此必須以序列化形式序列生成,我們下節會講到的Adaboost和GBDT是這一型別的代表;其實還有第三類,叫Stacking,即將初級學習器的輸出次級學習器的輸入特徵,深層神經網路甚至可以理解為Stacking整合學習的變種。

    隨機森林(Random Forest)是以決策樹為基學習器構建的Bagging整合學習演算法,其實現簡單、計算開銷小、並且在很多現實任務中表現出搶眼的效果。其主要透過樣本擾動和屬性擾動使得整合學習的泛化性顯著提高。樣本擾動是指透過對初始訓練集取樣構建每一棵決策樹;屬性擾動是指對基決策樹的每個節點,分裂時從該節點的屬性集合中隨機選擇k個屬性(k一般去log(d,2),d為屬性數量)。

    模型訓練程式碼地址:https://github.com/qianshuang/ml-exp

    def train():

    print("start training...")

    # 處理訓練資料

    train_feature, train_target = process_file(train_dir, word_to_id, cat_to_id)

    # 模型訓練

    model.fit(train_feature, train_target)

    def test():

    print("start testing...")

    # 處理測試資料

    test_feature, test_target = process_file(test_dir, word_to_id, cat_to_id)

    # test_predict = model.predict(test_feature) # 返回預測類別

    test_predict_proba = model.predict_proba(test_feature) # 返回屬於各個類別的機率

    test_predict = np.argmax(test_predict_proba, 1) # 返回機率最大的類別標籤

    # accuracy

    true_false = (test_predict == test_target)

    accuracy = np.count_nonzero(true_false) / float(len(test_target))

    print()

    print("accuracy is %f" % accuracy)

    # precision recall f1-score

    print()

    print(metrics.classification_report(test_target, test_predict, target_names=categories))

    # 混淆矩陣

    print("Confusion Matrix...")

    print(metrics.confusion_matrix(test_target, test_predict))

    if not os.path.exists(vocab_dir):

    # 構建詞典表

    build_vocab(train_dir, vocab_dir)

    categories, cat_to_id = read_category()

    words, word_to_id = read_vocab(vocab_dir)

    # kNN

    # model = neighbors.KNeighborsClassifier()

    # decision tree

    # model = tree.DecisionTreeClassifier()

    # random forest

    model = ensemble.RandomForestClassifier(n_estimators=10) # n_estimators為基決策樹的數量,一般越大效果越好直至趨於收斂

    train()

    test()執行結果:

    ead_category...

    read_vocab...

    start training...

    start testing...

    accuracy is 0.875000

    precision recall f1-score support

    娛樂 0.83 0.91 0.87 89

    房產 0.78 0.83 0.80 104

    教育 0.81 0.81 0.81 104

    家居 0.75 0.71 0.73 89

    遊戲 0.93 0.95 0.94 104

    時政 0.78 0.79 0.78 94

    時尚 0.94 0.89 0.92 91

    體育 0.98 0.97 0.97 116

    財經 0.95 0.91 0.93 115

    科技 0.99 0.96 0.97 94

    avg / total 0.88 0.88 0.88 1000

    Confusion Matrix...

    ---------------------

  • 中秋節和大豐收的關聯?
  • 心熱手心裡掉皮怎麼治?