機械学習初心者必読 | scikit-learn を使ったモデル構築のためのユニバーサル テンプレート

機械学習初心者必読 | scikit-learn を使ったモデル構築のためのユニバーサル テンプレート

独自の機械学習モデルを構築するには、次の 2 つの手順だけが必要です。

  1. 解決する必要がある問題の種類と、それを解決するために使用するアルゴリズムを把握します。
  2. モデルを構築するには、skicit-learn から対応するアルゴリズムを呼び出すだけです。はい!機械学習の分野では、機械学習を体験したいだけであれば、実装するのはとても簡単です。

最初のステップは簡単に解決できます

一般的な問題の種類は、分類、回帰、クラスタリングの 3 つだけです。特定の問題に対応する問題の種類を識別することも簡単です。たとえば、入力データからカテゴリ変数を取得する必要がある場合、それは分類問題です。 2 つのカテゴリに分割するのは 2 分類問題であり、3 つ以上のカテゴリに分割するのは多重分類問題です。一般的なものとしては、電子メールがスパムかどうかを判断すること、写真が猫か犬かを区別することなどが挙げられます。

入力データから特定の連続値を取得する必要がある場合、それは回帰問題です。たとえば、特定の地域の住宅価格を予測するなどです。

一般的に使用される分類および回帰アルゴリズムには、SVM (サポート ベクター マシン)、xgboost、KNN、LR アルゴリズム、SGD (確率的勾配降下アルゴリズム)、ベイズ (ベイズ推定)、ランダム フォレストなどがあります。これらのアルゴリズムのほとんどは、分類問題と回帰問題の両方を解決できます。

データ セットに対応する属性ラベルがない場合、どのサンプルがより近く、どのサンプルが遠く離れているかを分析するなど、このサンプル グループの空間分布を調べる必要があります。これがクラスタリングの問題です。一般的に使用されるクラスタリング アルゴリズムは k-means アルゴリズムです。

この記事では、主に 2 番目のステップである skicit-learn によるモデルの構築について説明します。笑ってしまうほどシンプルな、汎用的なモデル構築テンプレートのセットをご紹介します。 scikit-learn によって実装されたアルゴリズムであれば、この方法ですぐに呼び出すことができます。これら 3 つのユニバーサル テンプレートを念頭に置くと、独自の機械学習モデルを簡単に構築できます。

準備

ユニバーサル テンプレートを紹介する前に、3 つのテンプレートをより深く理解するために、ユニバーサル テンプレートを適用する小さな例として Iris データセットを読み込みます。Iris データセットについては前回の記事で何度も触れたので、ここでは繰り返しません。これは典型的な多重分類問題です。読み込み手順は次のとおりです。

1. データセットの読み込み

元のデータセットには多くの null 値が含まれており、カテゴリ機能ではさまざまな花の名前を表すために英語名が使用されているため、それらを数値に変換する必要もあります。

scikit-learn のデータセット サブパッケージには、Iris データセットもあります。このデータセットと元のデータセットの違いは、scikit-learn が null 値問題を事前に処理しているため、トレーニング用にモデルに直接入力できることです。したがって、便宜上、scikit-learn データセットを直接使用します。読み込み方法は次のとおりです。

 sklearn.datasets からload_iris インポートする
データ= load_iris ()
x = データ. データ
y = データ. ターゲット

x の値は以下のようになります。scikit-learn はデータセットから null 値を削除して配列に格納するため、x は 150 個のデータの 4 つの特徴を格納する (150,4) の配列になっていることがわかります。

、3.4、1.4、0.2]、[4.9、3.1、1.5、0.1]、[5. 、3.6、1.4、0.2]、[5.4、3.9、1.7、0.4]、[4.6、3.4、1.4、0.3]、[5. 、3.4、1.5、0.2]、[4.4、2.9、1.4、0.2]、[4.9、3.1、1.5、0.1]、[5.4、3.7、1.5、0.2]、[4.8、3.4、 1.6, 0.2]、[4.8, 3. , 1.4, 0.1]、[4.3, 3. , 1.1, 0.1]、…………

y 値は次の通りで、合計 150 行あり、0、1、2 は 3 種類の花を表します。

array([0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、 1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1、1 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

2. データセットの分割

データ セットを分割する目的は、モデルがトレーニング セットとテスト セットでオーバーフィッティングしていないかどうかを確認することです。train_test_split を使用する目的は、テスト セットがデータ セットから均等に分割されるようにすることです。ここでは、データ セットの 10% をテスト セットとして取り出します。

 sklearn.model_selection からtrain_test_split インポートします
train_xtest_xtrain_ytest_y = train_test_split ( xytest_size = 0.1random_state = 0 )

ユニバーサルテンプレート V1.0

基本的なアルゴリズムモデルを素早く構築するのに役立ちます

異なるアルゴリズムでは、名前とモデル パラメータが変更されるだけです。

このユニバーサル テンプレートを使用すると、次の手順は、コピーして貼り付け、名前を変更するだけです。

さらに、scikit-learn では、各パッケージの場所は規則的です。たとえば、ランダム フォレストは統合学習フォルダー内にあります。

テンプレート 1.0 アプリケーションケース

1. SVM分類モデルを構築する

情報を調べると、svm アルゴリズムは scikit-learn.svm.SVC の下にあることがわかります。

  • アルゴリズムの位置記入: svm
  • アルゴリズム名: SVC()
  • モデルに名前を付けることができます。ここではsvm_modelと呼びます。

テンプレートを適用すると、次の手順が実行されます。

 # svm 分類器
sklearn . svm からSVC をインポートします
sklearn.metrics からaccuracy_score ​をインポートします
svm_model = SVC ()
svm_model . fit ( train_xtrain_y )
pred1 = svm_model.predict (train_x )
精度1 = 精度スコア( 訓練y予測1 )
print ( 'トレーニングセットの精度: %.4f' % 精度1 )
pred2 = svm_model.predict ( test_x )
精度2 = 精度スコア( テストy予測2 )
print ( 'テストセットの精度: %.4f' % 精度2 )

出力:

  • トレーニングセットの精度: 0.9810
  • テストセットの精度: 0.9778

2. LR分類モデルの構築

同様に、sklearn.linear_model.LogisticRegression の下にある LR アルゴリズムを見つけます。

  • アルゴリズムの位置を記入: linear_model
  • アルゴリズム名: LogisticRegression
  • モデル名は lr_model です。

手順は次のとおりです。

テンプレートを適用すると、次の手順が実行されます。

 # ロジスティック回帰分類器
sklearn.linear_model からLogisticRegression インポートします
from sklearn . metrics import acceleration_score # スコアリング関数は精度を使用して評価されます
lr_model = ロジスティック回帰()
lr_model . fit ( train_x , train_y )
pred1 = lr_model.predict (train_x )
精度1 = 精度スコア( 訓練y予測1 )
print ( 'トレーニングセットの精度: %.4f' % 精度1 )
pred2 = lr_model.predict (test_x )
精度2 = 精度スコア( テストy予測値2 )
print ( 'テストセットの精度: %.4f' % 精度2 )

出力:

  • トレーニングセットの精度: 0.9429
  • テストセットの精度: 0.8889

3. ランダムフォレスト分類モデルを構築する

ランダム フォレスト アルゴリズムは、sklearn.ensemble.RandomForestClassifier にあります。これで、自分で記述できるはずです。これは、この記事の小さなテストです。コメント セクションに回答を記入してください。

ユニバーサルテンプレート V2.0

アルゴリズムモデルの評価をより科学的にするためにクロスバリデーションを追加する

1.0 バージョンのテンプレートでは、同じプログラムを複数回実行すると、実行ごとに得られる精度が同じではなく、一定の範囲内で変動することがわかります。これは、データがモデルに入力される前に選択され、データがモデルに入力される順序がトレーニングを実行するたびに異なるためです。したがって、同じプログラムであっても、モデルの最終的なパフォーマンスは良い場合も悪い場合もあります。

さらに悪いことに、場合によっては、パラメータ設定を調整することでトレーニング セットでモデルのパフォーマンスが最適化されても、テスト セットで過剰適合が発生する可能性があります。現時点では、トレーニング セットで取得したスコアは、モデルの一般化パフォーマンスを効果的に反映できません。

上記の 2 つの問題を解決するには、検証セットをトレーニング セットから分割し、クロス検証と組み合わせて解決する必要があります。まず、トレーニング セットから、トレーニングには参加しない検証セットが分離されます。モデルは、モデルのトレーニングが完了した後にのみ評価され、その後、テスト セットで最終評価が実行されます。

ただし、これではモデルの学習に使用できるサンプル数が大幅に減少するため、クロスバリデーションを使用して複数回トレーニングする必要があります。たとえば、最も一般的に使用される k 分割交差検証を下の図に示します。主にトレーニング セットを k 個の小さなセットに分割します。次に、k-1 個のトレーニング サブセットがモデルをトレーニングするためのトレーニング セットとして使用され、残りの 1 つのトレーニング セット サブセットがモデル検証のための検証セットとして使用されます。これには k 回のトレーニングが必要であり、トレーニング セットの最終評価スコアはすべてのトレーニング結果の評価スコアの平均になります。

これにより、トレーニング セット内のすべてのデータがトレーニングに参加できるようになり、一方で、複数の計算を通じてより代表的なスコアが得られます。唯一の欠点は、計算コストが非常に高く、計算量が k 倍に増加することです。

これが原則ですが、理想は希望に満ちていますが、現実は非常に骨組みだけです。自分で実装しようとしたとき、大きな問題に直面しました。トレーニング セットを K 個の部分に均等に分割するにはどうすればよいでしょうか?

この質問について、あまり深く考える必要はありません。私たちは今、巨人の肩の上に立っていることを忘れないでください。scikit-learn は、優れた数学者とプログラマーの知恵によって考え出された均一分割法を cross_val_score() 関数に統合しました。この関数を呼び出すだけで済みます。分割アルゴリズムについて自分で考える必要はなく、循環トレーニング用の for ループを書く必要もありません。

ユニバーサル テンプレート 2.0 は次のとおりです。

モデル、データ、検証セットの数を関数に入力すると、関数は上記のプロセスを自動的に実行します。

精度を計算するときは、平均精度を出力するだけです。

 # 平均精度を出力する
# print("トレーニング セットの精度: %0.2f " % scores1.mean())

しかし、クロスバリデーションを実行して多くの計算を行ったため、平均値を計算するだけでは少し無駄があります。次のコードを使用して、精度の信頼度を計算できます。

 # 精度の平均と信頼区間を出力する
print ( "トレーニング セットの平均精度: %0.2f (+/- %0.2f)" % ( scores2 . mean (), scores2 . std () * 2 ))

テンプレート 2.0 の適用例:

1. SVM分類モデルを構築する

手順は次のとおりです。

 ### svm 分類器
sklearn.model_selection からcross_val_score インポートします
sklearn . svm からSVC をインポートします
svm_model = SVC ()
svm_model . fit ( train_xtrain_y )
scores1 = cross_val_score ( svm_modeltrain_xtrain_ycv = 5スコアリング= 'accuracy' )
# 精度の平均と信頼区間を出力する
print ( "トレーニング セットの精度: %0.2f (+/- %0.2f)" % ( scores1 . mean (), scores1 . std () * 2 ))
scores2 = cross_val_score ( svm_modeltest_xtest_ycv = 5スコアリング= 'accuracy' )
# 精度の平均と信頼区間を出力する
print ( "テストセットの平均精度: %0.2f (+/- %0.2f)" % ( scores2 . mean (), scores2 . std () * 2 ))
印刷( スコア1 )
印刷( スコア2 )

出力:

トレーニングセットの精度: 0.97 ( +/- 0.08 )

テストセットの平均精度: 0.91 ( +/- 0.10 )

[1. 1. 1. 0.9047619 0.94736842 ]

[1. 0 .88888889 0 .88888889 0 .875 0 .875 ]

2. LR分類モデルの構築

 # ロジスティック回帰分類器
sklearn.model_selection からcross_val_score インポートします
sklearn.linear_model からLogisticRegression インポートします
lr_model = ロジスティック回帰()
lr_model . fit ( train_x , train_y )
scores1 = cross_val_score ( lr_modeltrain_xtrain_ycv = 5スコアリング= 'accuracy' )
# 精度の平均と信頼区間を出力する
print ( "トレーニング セットの精度: %0.2f (+/- %0.2f)" % ( scores1 . mean (), scores1 . std () * 2 ))
scores2 = cross_val_score ( lr_modeltest_xtest_ycv = 5スコアリング= 'accuracy' )
# 精度の平均と信頼区間を出力する
print ( "テストセットの平均精度: %0.2f (+/- %0.2f)" % ( scores2 . mean (), scores2 . std () * 2 ))
印刷( スコア1 )
印刷( スコア2 )

出力:

トレーニングセットの精度: 0.94 ( +/- 0.07 )

テストセットの平均精度: 0.84 ( +/- 0.14 )

[0.90909091 1 . 0 .95238095 0 .9047619 0 .94736842]

[0.90909091 0 .88888889 0 .88888889 0 .75 0 .75 ]

ランダムフォレストは、小規模なテストとして引き続き保持されます。

注: 複数の指標を一度に評価する場合は、複数の評価指標を一度に入力できる cross_validate() 関数を使用することもできます。

ユニバーサルテンプレート V3.0

パラメータ調整によりアルゴリズムのパフォーマンスがさらに向上します

上記のモデルは、アルゴリズムのデフォルトのパラメータを使用してトレーニングされています。データセットが異なれば、適用可能なパラメータも必然的に異なります。自分でアルゴリズムを設計することは不可能であり、パラメータを調整することしかできません。パラメータの調整は、大多数のアルゴリズム エンジニアの最後の仕事です。それに、アルゴリズムを開発するときにパラメータを調整しないと、「錬金術エンジニア」としてのアルゴリズムエンジニアの評判が下がってしまうのではないでしょうか?

Scikit-learn は、さまざまなアルゴリズムに対してさまざまなパラメータも提供しており、自分で調整できます。詳細に説明すれば、複数の記事を書くことができます。この記事の目的は、汎用的なアルゴリズムフレームワークテンプレートを構築することなので、ここでは一般的な自動パラメータ調整方法のみを紹介します。

まず、scikit-learn は、各アルゴリズムの調整可能なパラメータを表示するための algorithm().get_params() メソッドを提供します。たとえば、SVM 分類アルゴリズムの調整可能なパラメータを表示する場合は、次のようにします。

 SVC () .get_params ()

出力は、SVM アルゴリズムの調整可能なパラメータとシステムのデフォルト パラメータ値です。

 { 'C' : 1 .0,

'キャッシュサイズ' : 200

'class_weight' : なし、

'係数0' : 0.0 ,

'決定関数の形状' : 'ovr'

「度」 : 3 ,

'ガンマ' : '自動'

'カーネル' : 'rbf'

'max_iter' : -1 ,

「確率」 : False、

'random_state' : なし、

「縮小」 :確かに、

'許容誤差' : 0.001 ,

'verbose' : False}

次に、V3.0 ユニバーサル テンプレートを紹介します。

パラメータの形式は次のとおりです。

プログラムはこれらのパラメータの組み合わせ効果を順番にテストするので、自分で実装するために苦労する必要はありません。これを書いて、scikit-learn のような便利な機械学習パッケージを書いてくれた皆さんに感謝したいと思います。突然、私はあることわざを思い出しました。「平和な人生など存在しない、それはただ誰かがあなたの代わりに重荷を背負ってくれているだけだ。」

これを見て、なぜリスト、辞書、リストの 3 レベルのネスト方式を使用するのか疑問に思う人もいるかもしれません。パラメータを直接辞書形式にすることはできませんか?答えは「はい、しかし良くありません」です。

リストはこれを実行し、リスト内の辞書内の 1 つのパラメータのみが一度に調整されるようにします。

実行後、best_model は取得した最適なモデルであり、このモデルを予測に使用できます。

もちろん、best_model には多くの便利な属性があります。

  • best_model.cv_results_: さまざまなパラメータでの評価結果を表示できます。
  • best_model.param_ : モデルの最適なパラメータを取得します
  • best_model.best_score_: モデルの最終スコアを取得します

テンプレート 3.0 アプリケーション事例

SVM分類器の実装

 ###1. SVM分類器
sklearn . model_selection からcross_val_scoreGridSearchCV をインポートします
sklearn . svm からSVC をインポートします
svm_model = SVC ()
パラメータ= [
{ 'カーネル' :[' 線形' ], 'C' : [1,10,100,100 ] } ,
{ 'カーネル' :[ 'ポリ' ], 'C' :[ 1 ], '度' :[ 2,3 ] },
{ 'カーネル' : [ 'rbf' ]、 ' C' : [ 1、10、100、100 ]'ガンマ' : [1、0.1、0.01、0.001 ] }
]
best_model = GridSearchCV ( svm_modelparam_grid = paramscv = 5スコアリング= 'accuracy' )
ベストモデルに適合( train_x , train_y )

1) 最高スコアを確認する:

 ベストモデルベストスコア

出力:

 0 .9714285714285714

2) 最適なパラメータを確認します。

 ベストモデルベストパラメータ

出力:

 { 'C' : 1'カーネル' : '線形' }

3) 最適モデルのすべてのパラメータを表示します。

 ベストモデルベスト推定値

この機能により、調整されていないパラメータが表示されるため、モデル全体のパラメータを確認しやすくなります。

4) 各パラメータのクロス検証結果を表示します。

 ベストモデル.cv_results_

注記:

1. 以前のバージョンはbest_model.grid_scores_でしたが、現在は削除されています。

2. この関数は大量のデータを出力しますが、表示しにくいため、通常は使用されません。

実際の使用においては、計算リソースが十分であれば、一般的には 3 番目の普遍式が使用されます。計算リソースを節約し、できるだけ早く結果を計算するには、後で紹介する手動パラメータ調整方法も使用されます。

もちろん、ユニバーサル テンプレートの使用方法を説明するために、この記事ではすべてのアルゴリズムを Iris データセットに実装しています。実際のアプリケーションでは、プロジェクトの時間が緊急の場合は、ニーズとデータ レベルに応じて適切なアルゴリズムを選択できます。具体的な選択方法については、scikit-learn の担当者が、データの量とアルゴリズムの種類に基づいて適切なモデルを選択できるように、非常に丁寧に図を描いています。この図はコレクションに推奨されます。


<<:  美団におけるナレッジグラフ可視化技術の実践と探究

>>:  Googleのジェフ・ディーンが単独著者として執筆: ディープラーニング研究の黄金の10年

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

...

AIの受賞作品の著作権申請が却下されました!著者は624のヒントを与えている

初めて受賞した AI 絵画「スペースオペラ」を覚えていますか?最近また注目を浴びているのが――著者の...

TOP50 人工知能のケーススタディ: AI は単なる誇大宣伝ではなく、努力によって実現される

AIは自慢するだけでなく、実践を通じて達成されます。コンセプトがどんなに優れていても、結果が重要です...

AIとデータ分析を活用してデータを収益化する4つの手法

ビジネスにとってのデータの経済的価値を概念化したり直接測定したりすることは困難です。多くの経営者は、...

WeiboにおけるSparkベースの大規模機械学習の応用

[[195122]]周知のとおり、Weibo のビジネスは 2015 年以降急速に成長しています。内...

AIと子ども経済が出会うとき、どうすれば中心的ポジションにデビューできるのか?

[[248753]]児童市場は非常に特殊で、この層は購買力がないにもかかわらず、消費市場の価値は数...

セキュリティ業界における顔認証アクセス制御の発展展望

数年前までは、アクセス制御は鍵や IC アクセス カードによって行われていたことは誰もが知っています...

ネットワークインテリジェンスに関する誤解は4つある

夕食後に AI について話さないと、社会の一員ではないような気がします。しかし、ネットワーク インテ...

...

純粋な乾物 | ディープラーニング研究の概要

[[195952]] 1. ディープラーニングディープラーニングといえば、一度でも触れたことがある人...

AIGC の 7 つの暗い側面

AIGC アルゴリズムがあらゆるスタイルの素晴らしいアートワークを生成し、素晴らしい文法で長い記事を...

...

限られたデータでモデルのパフォーマンスを最大化するにはどうすればよいですか? Baidu のエンジニアがデータ拡張サービスを構築

AI モデルの開発プロセスでは、トレーニング データが不十分なためにモデルのパフォーマンス向上が妨げ...

...

Java プログラミング スキル - データ構造とアルゴリズム「単方向リンク リスト」

[[386512]]基本的な紹介リンクリストは順序付きリストですが、メモリ内に次のように保存されま...