MLb-018 61『Python機械学習基礎教程』まとめ(下)

58929 ワード

このシリーズの文章は《Python機械学習基礎教程》の最も核心的な要点を精錬します

第四章データ表示と特徴工程


一、分類変数


1.One-Hot符号化(仮想変数)
  • )文字列符号化の分類データ(異なるが同じ意味を示すデータがある可能性がある:man、maleなど)
    print(data.gender.value_counts())
    
  • をチェックする.
  • 2)getを利用するdummies関数自動変換文字列と分類カラム
    data_dummies=pd.get_dummies(data)
    
  • 3)values属性でDataFrameをNumpy配列
    features = data_dummies.loc[:, 'feature_1':'feature_k']
    X = features.values
    y = data_dummies['target_1'].values
    # target , 0、1 
    
  • に変換する.
  • 4)注意:トレーニングとテストデータを同時に含むデータセットでget_を呼び出すdummies

  • 2、デジタルコードの分類変数をOneHotEncoderまたは置換時に文字列に変換する
    demo_df['Integer Feature'] = demo_df['Integer Feature'].astype(str)
    

    二、分箱、離散化、線形モデルとツリー


    1、具体的な操作
    bins = np.linspace(-3, 3, 11)
    # -3 3 10 
    which_bin = np.digitize(X, bins=bins)
    # 
    

    2、特徴1つの箱内のすべての点、いかなるモデルも同じ値の箱分け特徴を予測して線形モデルの性能を高め、決定木モデルの精度を下げる

    三、インタラクティブ特徴と多項式特徴


    1、ボックスを使用して連続特徴を拡張する
  • 1)元の特徴(ボックスデータ上の線形モデルへの傾きの追加:図中のx軸)
    X_combined = np.hstack([X, X_binned])
    reg = LinearRegression().fit(X_combined, y)
    line_combined = np.hstack([line, line_binned])
    reg.predict(line_combined)
    
  • を再追加する.
  • 2)インタラクティブフィーチャーまたは積フィーチャー(各箱に異なる傾きがある)
    X_product = np.hstack([X_binned,X* X_binned])
    reg = LinearRegression().fit(X_product, y)
    line_product = np.hstack([line_binned, line*line_binned])
    reg.predict(line_product)
    
  • を追加する.
    2、元の特徴を用いた多項式
  • 1)具体的な操作
    from sklearn.preprocessing import PolynomialFeatures
    poly = PolynomialFeatures(degree=10, include_bias=False)
    # x**10 ,include_bias False 
    poly.fit(X)
    X_poly = poly.transform(X)
    poly.get_feature_names()
    # 
    
  • 2)多項式回帰モデル(多項式特徴は線形回帰とともに用いる)
    reg = LinearRegression().fit(X_poly, y)
    line_poly = poly.transform(line)
    reg.predict(line_poly)
    
  • 四、単変数非線形変換


    logおよびexp関数は、パラメータがデータの相対的な割合を調整し、線形モデルまたはニューラルネットワークの学習効果を改善するのに役立つ.
    X_train_log=np.log(X_train)
    X_train_exp=np.exp(X_train)
    

    使用シヨウ:フィーチャーとターゲットの間に非線形関係がある

    五、自動化特徴選択


    1、特徴選択の原因を概説する:多すぎる特徴はモデルをより複雑に特徴作用の大きさを判断する基本戦略:単変数統計、モデルに基づく選択、反復選択(いずれも監督方法)2、単変数統計
  • 1)概念操作:各特徴と目標値の関係に統計的有意性があるかどうかを計算し、最も信頼性の高い特徴(分類問題-分散分析)使用閾値:SelectKBest(固定個数kの特徴を選択)、SelectPercentile(固定パーセントの特徴を選択)
  • を選択する.
  • 2)具体的な操作
    from sklearn.feature_selection import SelectPercentile
    select = SelectPercentile(percentile=50)
    # 50% 
    select.fit(X_train, y_train)
    X_train_selected = select.transform(X_train)
    
  • 3)ビジュアル化テクニック
    mask = select.get_support()
    # get_support 
    print(mask)
    plt.matshow(mask.reshape(1, -1), cmap='gray_r')
    # , True, False
    plt.xlabel("Sample index")
    plt.yticks(())
    
  • 3、モデルに基づく特徴選択
  • 1)概念は1つの監督学習モデルを用いて各特徴の重要性を判断する特徴で選択された監督モデルは必ずしも最終監督モデルと同じではなく単変数選択とは異なり、モデルの選択に基づいてすべての特徴(インタラクティブアイテムを取得可能)
  • を同時に考慮する.
  • 2)具体的な操作
  • A.100本の木を含むランダム森林分類器を用いて特徴的重要性
    from sklearn.feature_selection import SelectFromModel
    from sklearn.ensemble import RandomForestClassifier
    select = SelectFromModel(RandomForestClassifier(n_estimators=100, random_state=42),threshold="median")
    
  • を計算する.
  • B.実フィットモデル
    select.fit(X_train, y_train)
    X_train_l1 = select.transform(X_train)
    
  • C.性能
    X_test_l1 = select.transform(X_test)
    score = LogisticRegression().fit(X_train_l1, y_train).score(X_test_l1, y_test)
    print("Test score: {:.3f}".format(score))
    
  • を見る.

    4、反復フィーチャー選択
  • 1)概念は一連のモデルを構築し、各モデルは異なる数の特徴方法を使用する:逐一追加または逐一削除(再帰的特徴除去、RFE)
  • 2)具体的な操作
  • A.構築モデル
    from sklearn.feature_selection import RFE
    select = RFE(RandomForestClassifier(n_estimators=100, random_state=42),n_features_to_select=40)
    select.fit(X_train, y_train)
    
  • B.パフォーマンスの表示
    X_train_rfe = select.transform(X_train)
    X_test_rfe = select.transform(X_test)
    score = LogisticRegression().fit(X_train_rfe, y_train).score(X_test_rfe, y_test)
    print("Test score: {:.3f}".format(score))
    

  • 六、専門家の知識を利用する


    第五章モデル評価と改善


    一、クロス検証


    1、クロス検証の概要:汎化性能を評価する統計学的方法.データセットは複数回分割され、複数のモデルを訓練する必要がある利点:複数回分割:モデルの訓練セット選択に対する感度の欠点がわかる:計算コストの増加目的:特定のデータセット上で所定のアルゴリズムを訓練した後の汎化性能を評価する(新しいデータモデルを構築する方法ではない)
    2、基本操作(k折交差検証)
    from sklearn.model_selection import cross_val_score
    logreg = LogisticRegression()
    scores = cross_val_score(logreg, iris.data, iris.target, cv=5)
    #cv: 
    print("Cross-validation scores: {}".format(scores))
    

    3、階層kの折り返し交差検証(各折り返しカテゴリの割合はデータセット全体の割合と同じ)
  • 1)kfoldクロス検証分離器(cvパラメータとして使用可能)
    from sklearn.model_selection import KFold
    kfold = KFold(n_splits=3, shuffle=True, random_state=0)
    #shuffle: ( ,random_state )
    print("Cross-validation scores:
    {}"
    .format(cross_val_score(logreg, iris.data, iris.target, cv=kfold)))
  • 2)
    from sklearn.model_selection import LeaveOneOut
    loo = LeaveOneOut()
    scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)
    # , , , 
    print("Number of cv iterations: ", len(scores))
    print("Mean accuracy: {:.2f}".format(scores.mean()))
    
  • .
  • 3)乱交検証
    from sklearn.model_selection import ShuffleSplit
    shuffle_split = ShuffleSplit(test_size=.5, train_size=.5, n_splits=10)
    # train_size , test_size , n_iter , :train_size+test_size<1​
    scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)
    print("Cross-validation scores:
    {}"
    .format(scores))
  • 4)パケット交差検証(顔の表情認識のようなデータパケットの高さ相関に適用され、新しい人に広がりたい)
    from sklearn.model_selection import GroupKFold
    groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]
    scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3))
    # , 
    print("Cross-validation scores:
    {}"
    .format(scores))
  • .

    二、グリッド検索


    1、概要目的:最適な汎化性能を提供するモデルのパラメータを見つけて簡単なプログラミング実現
    for gamma in [0.001, 0.01, 0.1, 1, 10, 100]:
    for C in [0.001, 0.01, 0.1, 1, 10, 100]:
    svm = SVC(gamma=gamma, C=C)
    svm.fit(X_train, y_train)
    score = svm.score(X_test, y_test)
    

    2、パラメータのオーバーフィットリスクを低減する——検証セット
  • 1)2回の区分
    X_trainval, X_test, y_trainval, y_test = train_test_split(iris.data, iris.target, random_state=0)
    X_train, X_valid, y_train, y_valid = train_test_split(X_trainval, y_trainval, random_state=1)
    
  • 2)コアコードの改良:モデル
    score = svm.score(X_valid, y_valid)
    
  • を検証セット上で評価する
  • )サイクル終了後:トレーニング+検証セットでモデルを再構築し、テストセットで
    svm.fit(X_trainval, y_trainval)
    test_score = svm.score(X_test, y_test)
    
  • を評価する
    3、クロス検証付きメッシュ検索
  • 1)コアコードの改良:クロス検証を実行し、平均精度
    scores = cross_val_score(svm, X_trainval, y_trainval, cv=5)
    score = np.mean(scores)
    
  • を計算する.
  • 2)sklearnの推定器
    param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100],'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
    # 
    from sklearn.model_selection import GridSearchCV
    grid_search = GridSearchCV(SVC(), param_grid, cv=5,return_train_score=True)
    grid_search.fit(X_train, y_train)
    # 
    print("Test set score: {:.2f}".format(grid_search.score(X_test, y_test)))
    # :best_score_ , score 
    
  • を利用する.
  • )分析結果
    results = pd.DataFrame(grid_search.cv_results_)
    # ​​
    
  • 4)非メッシュ検索:param_gridは辞書からなるリスト
    param_grid = [{'kernel': ['rbf'],'C': [0.001, 0.01, 0.1, 1, 10, 100],'gamma': [0.001, 0.01, 0.1, 1, 10, 100]},{'kernel': ['linear'],'C': [0.001, 0.01, 0.1, 1, 10, 100]}]
    
  • に変更することができる.

    三、評価指標と採点


    1、回帰指標:デフォルトのR^2を使用する(すべての回帰器のscore方法で与える)
    2、不平和データセット:一つのクラスが圧倒的多数を占める
    3、二分類指標
  • )混同行列
    from sklearn.metrics import confusion_matrix
    confusion = confusion_matrix(y_test, pred_logreg)
    # confusion 2*2 
    
  • 2)評価指標
  • A.精度:正例における真の正例の割合
  • B.リコール率:真の正例は正例の割合
  • と予測される.
  • C.F 1スコア:精度とリコール率の調和平均
  • D.ドラフトレポート
    from sklearn.metrics import classification_report
    print(classification_report(y_test, svc.predict(X_test)))
    
  • E.描画精度-リコール率曲線
    from sklearn.metrics import precision_recall_curve
    precision, recall, thresholds = precision_recall_curve(y_test, svc.decision_function(X_test))
    plt.plot(precision, recall, label="precision recall curve")
    
  • F.合計曲線:平均精度(曲線積分面積、戻り浮動小数点数)
    from sklearn.metrics import average_precision_score
    ap_svc = average_precision_score(y_test, svc.decision_function(X_test))
    
  • G.ROC曲線(被験者作動特性曲線、偽正例率および真例率)
    from sklearn.metrics import roc_curve
    fpr, tpr, thresholds = roc_curve(y_test, svc.decision_function(X_test))
    plt.plot(fpr, tpr, label="ROC Curve")
    
  • H.総括曲線:曲線下面積(AUC、戻り浮動小数点数)
    from sklearn.metrics import roc_auc_score
    svc_auc = roc_auc_score(y_test, svc.decision_function(X_test))
    

  • 4、多分類指標
  • 1)多分類指標の混同行列
  • 2)アンバランスデータセット:f-スコア(多分類バージョン)
  • 各カテゴリに対して1つの2分類f-スコア(他のすべてのカテゴリは逆クラス)
  • を計算する
  • 次のポリシーを使用して、カテゴリ別のfスコアを平均します.
  • マクロ平均:サンプルサイズ
  • に関係なく、すべてのカテゴリに同じ重みが与えられます.
  • 加重平均:各カテゴリのサポートは重みとしてカテゴリf-スコア平均
  • を計算する.
  • マイクロ平均:全カテゴリにおけるFP、FN、TPの総数を算出し、精度、リコール率、f-スコア
  • を算出する.
  • 使用方法
  • は各サンプルに対して同等に見る:微小平均f-分数
    f1_score(y_test, pred, average="micro")
    
  • 各カテゴリを同等に扱う:マクロ平均f-スコア
    f1_score(y_test, pred, average="macro")
    

  • 5、モデル選択における評価指標の使用
  • 目的:GridSearchCVまたはcross_を使用val_scoreモデル選択にAUCなどの指標
  • を用いる.
  • メソッド:scoringパラメータ
  • クロス検証
    roc_auc =  cross_val_score(SVC(), X, y == 1,scoring="roc_auc")
    # ‘accuracy’( ), ‘roc_auc’(AUC)
    
  • グリッド検索
    grid = GridSearchCV(SVC(), param_grid=param_grid, scoring="roc_auc")
    # 
    
  • でよく使われるのはscoringパラメータです
  • 分類問題
  • 精度(accuracy)
  • ROC曲線下面積(roc_auc)
  • 精度-回収率曲線下面積(average_precision)
  • の4つの二分類f 1スコアおよび重み付け変異体(f 1,f 1_macro,f 1_micro,f 1_weighted)
  • .
  • 回帰問題
  • R^2スコア(r 2)
  • 平均二乗誤差(mean_squared_error)
  • 平均絶対誤差(mean_absolute_error)


  • 四、まとめ


    データ区分:トレーニングセット-トレーニングモデル;検証セット-モデルとパラメータを選択します.テストセット-モデル評価機械学習の最終目的を明確にする:モデル評価と選択の指標がモデルの実際の用途によく代わることを確保する

    第六章アルゴリズムチェーンとパイプ


    一、前処理によるパラメータ選択

  • 導入:任意の前処理を行う前にデータセットの分割を完了する(処理プロセスの最外層サイクルに位置するクロス検証)
  • .
  • Pipelineクラスは、fit、predict、scoreメソッドを持つ単一の推定器自体に対して複数の処理ステップを統合する最も一般的な方法である:前処理ステップ(スケールなど)を分類器などの監視モデルと接続する
  • .

    二、パイプの構築

    from sklearn.pipeline import Pipeline
    pipe=Pipeline([("scaler", MinMaxScaler()), ("svm",SVC())])
    # , scaler, MinMaxScaler , svm, SVC() 
    pipe.fit(X_train, y_train)
    # 
    print("Test score: {:.2f}".format(pipe.score(X_test, y_test)))
    # score 
    

    三、グリッド検索でパイプを使用する

    param_grid = {'svm__C': [0.001, 0.01, 0.1, 1, 10, 100],'svm__gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
    # : + + 
    grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)
    grid.fit(X_train, y_train)
    # MinMaxScaler , , 
    print("Best cross-validation accuracy: {:.2f}".format(grid.best_score_))
    print("Test set score: {:.2f}".format(grid.score(X_test, y_test)))
    print("Best parameters: {}".format(grid.best_params_))
    

    四、共通のパイプインタフェース


    1、make_を使うpipelineはパイプを簡単に作成できます
    pipe_short = make_pipeline(MinMaxScaler(), SVC(C=100))
     : , step 
    

    2、namedを利用するStepアクセスステッププロパティ
    components = pipe.named_steps["pca"].components_
    

    3、アクセスメッシュ検索パイプの属性
    print("Best estimator:
    {}"
    .format(grid.best_estimator_)) # GridSearchCV LogisticRegression print("Logistic regression coefficients:
    {}"
    .format(grid.best_estimator_.named_steps["logisticregression"].coef_)) #

    五、グリッド検索前処理ステップとモデルパラメータ


    1、目的:監督タスクの出力で前処理パラメータを調整する
    from sklearn.preprocessing import PolynomialFeatures
    pipe = make_pipeline(StandardScaler(),PolynomialFeatures(),Ridge())
    # 、 pipe 
    param_grid = {'polynomialfeatures__degree': [1, 2, 3],'ridge__alpha': [0.001, 0.01, 0.1, 1, 10, 100]}
    # / 
    grid = GridSearchCV(pipe, param_grid=param_grid, cv=5, n_jobs=-1)
    grid.fit(X_train, y_train)
    

    2、Tips:ホットグラフでクロス検証結果を可視化
    plt.matshow(grid.cv_results_['mean_test_score'].reshape(3,-1),vmin=0,cmap='viridis')
    plt.xlabel('ridge__alpha')
    plt.ylabel('polynomialfeatures__degree')
    plt.xticks(range(len(param_grid['ridge__alpha'])),param_grid['ridge__alpha'])
    plt.yticks(range(len(param_grid['polynomialfeatures__degree'])),param_grid['polynomialfeatures__degree'])
    plt.colorbar()
    

    3、最適モデルと対応点数の表示
    print("Best parameters: {}".format(grid.best_params_))
    print("Test-set score: {:.2f}".format(grid.score(X_test, y_test)))
    

    六、グリッド検索どのモデルを使用するかを選択する


    検索メッシュリストを使用して、random forestが前処理を必要としないなどのステップをスキップするとNoneに設定されます.
    param_grid = [{'classifier': [SVC()], 'preprocessing': [StandardScaler(), None],'classifier__gamma': [0.001, 0.01, 0.1, 1, 10, 100],'classifier__C': [0.001, 0.01, 0.1, 1, 10, 100]},{'classifier': [RandomForestClassifier(n_estimators=100)],'preprocessing': [None], 'classifier__max_features': [1, 2, 3]}]
    

    メッシュはこのように定義され、残りは同じです.