2017-03-27 12 views
0

私は、テキストの分類に、私は、私は次のように追加学習を使用しようとしたその理由のために、かなりの行列を得た特徴抽出工程の後に働いています:クロスバリデーションされたコア学習モデルを実装しようとする際に問題が発生しましたか?

import xgboost as xgb 
from sklearn.model_selection import ShuffleSplit, train_test_split 
from sklearn.metrics import accuracy_score as acc 


def incremental_learning2(X, y): 
    # split data into training and testing sets 
    # then split training set in half 

    X_train, X_test, y_train, y_test = train_test_split(X, 
                 y, test_size=0.1, 
                 random_state=0) 

    X_train_1, X_train_2, y_train_1, y_train_2 = train_test_split(X_train, 
                y_train, 
                test_size=0.5, 
                random_state=0) 

    xg_train_1 = xgb.DMatrix(X_train_1, label=y_train_1) 
    xg_train_2 = xgb.DMatrix(X_train_2, label=y_train_2) 
    xg_test = xgb.DMatrix(X_test, label=y_test) 

    #params = {'objective': 'reg:linear', 'verbose': False} 
    params = {} 


    model_1 = xgb.train(params, xg_train_1, 30) 
    model_1.save_model('model_1.model') 

    # ================= train two versions of the model =====================# 
    model_2_v1 = xgb.train(params, xg_train_2, 30) 
    model_2_v2 = xgb.train(params, xg_train_2, 30, xgb_model='model_1.model') 

    #Predictions 
    y_pred = model_2_v2.predict(X_test) 

    kfold = StratifiedKFold(n_splits=10, random_state=1).split(X_train, y_train) 
    scores = [] 

    for k, (train, test) in enumerate(kfold): 
     model_2_v2.fit(X_train[train], y_train[train]) 
     score = model_2_v2.score(X_train[test], y_train[test]) 
     scores.append(score) 

     print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1, np.bincount(y_train[train]), score)) 
    print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores))) 

を上記のコードに関しては。クロスバリデーションを行い、いくつかのインスタンスを予測しようとしました。しかし、それは動作していません。非常に大きなデータセットにGBMモデルをフィッティングして更新した後、相互検証されたメトリックと予測を取得するために、上記のコードを修正するにはどうすればよいですか。

+0

「それは機能していません」と詳しく説明できますか?また、 'python'タグを追加すると、おそらくその質問に目を向けるでしょう。 – Tchotchke

+0

ええと...私が「働いていない」と言っているのは、上記のコードがうまくいかないと言うことです。 @Tchotchke – tumbleweed

+0

何かがうまくいかない方法はたくさんあります。エラーが発生している場合は、その場合はどこですか?期待どおりの結果が得られていません。あなたが与える細かいほど、人々があなたを助けるのは簡単です。 – Tchotchke

答えて

1

これは私が思いついた解決策です。まず、我々は必要なモジュールをインポートし、根二乗平均誤差を計算する簡単な関数を定義します。

import numpy as np 
import xgboost as xgb 
from sklearn.model_selection import train_test_split as tts 
from sklearn.model_selection import StratifiedKFold 

def rmse(a, b): 
    return np.sqrt(((a - b) ** 2).mean()) 

ルートが(詳細はthis threadに見て)別々に計算することができ平均二乗誤差をするが、明確にするために私が選びました明示的な定式化。

あなたの機能はすばやく汚れています。あなたのコードの構造を同じに保つようにしましたが、読みやすさのために私はいくつかのリファクタリングを行っています。

def incremental_learning2(X, y, n_splits=10, params = {}):  
    # Initialize score arrays 
    sc_1, sc_2_v1, sc_2_v2 = (np.zeros(n_splits) for i in range(3)) 
    # Create cross-validator 
    kfold = StratifiedKFold(n_splits=n_splits, random_state=0).split(X, y) 
    # Iterate through folds 
    for k, (train, test) in enumerate(kfold): 
     # Split data 
     X_test, y_test = X[test], y[test]  
     splits = tts(X[train], y[train], test_size=0.5, random_state=0) 
     X_train_1, X_train_2, y_train_1, y_train_2 = splits 
     # Create data matrices 
     xg_train_1 = xgb.DMatrix(X_train_1, label=y_train_1) 
     xg_train_2 = xgb.DMatrix(X_train_2, label=y_train_2) 
     xg_test = xgb.DMatrix(X_test, label=y_test)  
     # Fit models 
     model_1 = xgb.train(params, xg_train_1, 30)   
     model_1.save_model('model_1.model') 
     model_2_v1 = xgb.train(params, xg_train_2, 30) 
     model_2_v2 = xgb.train(params, xg_train_2, 30, xgb_model='model_1.model') 
     # Make predictions and compute scores 
     preds = (m.predict(xg_test) for m in [model_1, model_2_v1, model_2_v2]) 
     sc_1[k], sc_2_v1[k], sc_2_v2[k] = (rmse(p, y_test) for p in preds) 
    # Return scores 
    return sc_1, sc_2_v1, sc_2_v2 

出力形式を改善して、結果を表形式で表示しました。この機能は、別の関数で実装されています

def display_results(a, b, c): 
    def hline(): 
     print('-'*50) 
    print('Cross-validation root mean square error\n')  
    print('Fold\tmodel_v1\tmodel_2_v1\tmodel_2_v2') 
    hline() 
    for k, (ak, bk, ck) in enumerate(zip(a, b, c)): 
     print('%s\t%.3f\t\t%.3f\t\t%.3f' % (k+1, ak, bk, ck))   
    hline() 
    print('Avg\t%.3f\t\t%.3f\t\t%.3f' % tuple(np.mean(s) for s in [a, b, c])) 
    print('Std\t%.3f\t\t%.3f\t\t%.3f' % tuple(np.std(s) for s in [a, b, c])) 

デモ

あなたのデータセットを共有していなかったので、私は自分のコードをテストするために、モックデータを生成する必要がありました。

from sklearn.datasets import make_blobs 
X, y = make_blobs(n_samples=500000, centers=50, random_state=0) 

scores_1, scores_2_v1, scores2_v2 = incremental_learning2(X, y) 
display_results(scores_1, scores_2_v1, scores2_v2) 

上記のコードはエラーなしで実行され、出力は次のようになります。

Cross-validation root mean square error 

Fold model_v1  model_2_v1  model_2_v2 
-------------------------------------------------- 
1  9.127   9.136   9.116 
2  9.168   9.155   9.128 
3  9.117   9.095   9.080 
4  9.107   9.113   9.089 
5  9.122   9.126   9.109 
6  9.096   9.099   9.084 
7  9.148   9.163   9.145 
8  9.089   9.090   9.069 
9  9.128   9.122   9.108 
10  9.185   9.162   9.160 
-------------------------------------------------- 
Avg  9.129   9.126   9.109 
Std  0.029   0.026   0.028 

備考私もmodel_1クロス検証しています比較のために

  • サンプルの実行model_1model_2_v1はほぼ同じ精度を持っていますが、model_2_v2は合理的に期待できる通り、わずかに優れています。
  • データセットのサイズ(n_samples)とクラス数(centers)で遊んでいて、興味深いことに、これらのパラメータの値を小さくすると、model_2_v2は3つのうち最も正確です。
  • 別の設定を使用して、名前付き関数の引数paramsを適切に設定すると、期待通りに機能するはずです。
+0

助けてくれてありがとう!私は答えをチェックしています。 – tumbleweed

関連する問題