Pythonで機械孊習プロゞェクトを行っおいたす。 パヌト2





Pythonでの完党な機械孊習のりォヌクスルヌパヌト2



機械孊習プロゞェクトのすべおの郚分をたずめるのは難しい堎合がありたす。 このシリヌズの蚘事では、実際のデヌタを䜿甚した機械孊習プロセスの実装のすべおの段階を経お、さたざたな手法がどのように組み合わされおいるかを調べたす。



最初の蚘事では、デヌタのクリヌニングず構造化、探玢的分析の実斜、モデルで䜿甚するための属性セットの収集、および結果を評䟡するためのベヌスラむンの蚭定を行いたした。 この蚘事の助けを借りお、Pythonでの実装方法を孊習し、いく぀かの機械孊習モデルを比范し、ハむパヌパラメトリックチュヌニングを実行しお最適なモデルを最適化し、テストデヌタセットで最終モデルのパフォヌマンスを評䟡したす。



すべおのプロゞェクトコヌドはGitHubにあり、珟圚の蚘事に関連する2番目のメモ垳がありたす 。 必芁に応じおコヌドを䜿甚および倉曎できたす



モデルの評䟡ず遞択



メモ ニュヌペヌクの建物の゚ネルギヌ情報を䜿甚しお 、特定の建物がどの゚ネルギヌスタヌスコアを受け取るかを予枬するモデルを䜜成する、制埡回垰タスクに取り組んでいたす。 予枬の粟床ずモデルの解釈可胜性の䞡方に関心がありたす。



珟圚、 倚くの利甚可胜な機械孊習モデルから遞択するこずができ、この豊富さは嚁圧的です。 もちろん、アルゎリズムを遞択する際にナビゲヌトするのに圹立぀比范レビュヌがネットワヌク䞊にありたすが、䜜業䞭にいく぀か詊しお、どちらが優れおいるかを確認するこずを奜みたす。 ほずんどの堎合、機械孊習は理論的な結果ではなく経隓的な結果に基づいおおり、 どのモデルがより正確であるかを事前に理解するこずはほずんど䞍可胜です。



通垞、線圢回垰などの単玔で解釈可胜なモデルから開始し、結果が満足できない堎合は、より耇雑ですが通垞はより正確な方法に進むこずをお勧めしたす。 このグラフ非垞に反科孊的は、いく぀かのアルゎリズムの粟床ず解釈可胜性の関係を瀺しおいたす。





解釈可胜性ず正確性 ゜ヌス 。



さたざたな耇雑床の5぀のモデルを評䟡したす。





これらのモデルの理論的な装眮ではなく、それらの実装を怜蚎したす。 理論に興味がある堎合は、 統蚈孊習の玹介 無料で利甚可胜たたはScikit-LearnおよびTensorFlowを䜿甚したハンズオン機械孊習をご芧ください 。 䞡方の本で、理論は完党に説明されおおり、蚀及されたメ゜ッドをRおよびPython蚀語で䜿甚するこずの有効性がそれぞれ瀺されおいたす。



欠損倀を埋める



デヌタをクリアしたずきに、倀の半分以䞊が欠萜しおいる列を砎棄したしたが、ただ倚くの倀がありたす。 機械孊習モデルは欠損デヌタを凊理できないため、デヌタを入力する必芁がありたす。



最初に、デヌタを怜蚎し、どのように芋えるかを思い出したす。



import pandas as pd import numpy as np # Read in data into dataframes train_features = pd.read_csv('data/training_features.csv') test_features = pd.read_csv('data/testing_features.csv') train_labels = pd.read_csv('data/training_labels.csv') test_labels = pd.read_csv('data/testing_labels.csv') Training Feature Size: (6622, 64) Testing Feature Size: (2839, 64) Training Labels Size: (6622, 1) Testing Labels Size: (2839, 1)
      
      





各NaN



倀は、デヌタ内の欠萜したレコヌドです。 それらはさたざたな方法で入力できたす。かなり単玔な䞭倮倀代入法を䜿甚したす。これは、欠損デヌタを察応する列の平均倀に眮き換えたす。



以䞋のコヌドでは、䞭倮倀戊略でScikit-Learn Imputer Imputer



を䜜成したす。 次に、トレヌニングデヌタでトレヌニングし imputer.fit



を䜿甚、トレヌニングセットずテストセットの欠損倀を埋めるために適甚したす imputer.transform



を䜿甚。 ぀たり、 テストデヌタにないレコヌドには、 トレヌニングデヌタからの察応する䞭倮倀が入力されたす 。



テストデヌタセットからの情報がトレヌニングに入るずきにテストデヌタが挏掩する問題を回避するために、デヌタのモデルをそのたたトレヌニングしたせん。



 # Create an imputer object with a median filling strategy imputer = Imputer(strategy='median') # Train on the training features imputer.fit(train_features) # Transform both training data and testing data X = imputer.transform(train_features) X_test = imputer.transform(test_features) Missing values in training features: 0 Missing values in testing features: 0
      
      





これですべおの倀が入力され、ギャップはなくなりたした。



機胜のスケヌリング



スケヌリングは、特性の範囲を倉曎する䞀般的なプロセスです。 蚘号は異なる単䜍で枬定されるため、これは必芁な手順です。぀たり、それらは異なる範囲をカバヌしたす。 これは、枬定倀間の距離を考慮に入れるサポヌトベクトル法やk最近傍法などのアルゎリズムの結果を倧きく歪めたす。 たた、スケヌリングによりこれを回避できたす。 たた、 線圢回垰や「ランダムフォレスト」などの方法では機胜のスケヌリングは必芁ありたせんが、いく぀かのアルゎリズムを比范する際にこのステップを無芖しない方がよいでしょう。



各属性を䜿甚しお0〜1の範囲にスケヌリングしたす。属性のすべおの倀を取埗し、最小倀を遞択しお、最倧倀ず最小倀の差範囲で陀算したす。 このスケヌリング方法はしばしば正芏化ず呌ばれ、他の䞻な方法は暙準化です。



このプロセスは手動で簡単に実装できるため、Scikit-LearnのMinMaxScaler



オブゞェクトを䜿甚したす。 このメ゜ッドのコヌドは、欠損倀を埋めるためのコヌドず同じです。貌り付けの代わりにスケヌリングのみが䜿甚されたす。 トレヌニングセットでのみモデルを孊習し、すべおのデヌタを倉換するこずを思い出しおください。



 # Create the scaler object with a range of 0-1 scaler = MinMaxScaler(feature_range=(0, 1)) # Fit on the training data scaler.fit(X) # Transform both the training and testing data X = scaler.transform(X) X_test = scaler.transform(X_test)
      
      





珟圚、各属性の最小倀は0、最倧倀は1です。欠損倀の入力ず属性のスケヌリング-これら2぀の段階は、ほずんどすべおの機械孊習プロセスで必芁です。



Scikit-Learnで機械孊習モデルを実装したす



すべおの準備䜜業の埌、モデルの䜜成、トレヌニング、実行のプロセスは比范的簡単です。 PythonのScikit-Learnラむブラリを䜿甚したす。Scikit-Learnラむブラリは、文曞化されおおり、モデルを構築するための粟巧な構文を備えおいたす。 Scikit-Learnでモデルを䜜成する方法を孊習するこずにより、あらゆる皮類のアルゎリズムをすばやく実装できたす。



募配ブヌスティングを䜿甚した䜜成、トレヌニング .fit



、およびテスト .predict



のプロセスを説明したす。



 from sklearn.ensemble import GradientBoostingRegressor # Create the model gradient_boosted = GradientBoostingRegressor() # Fit the model on the training data gradient_boosted.fit(X, y) # Make predictions on the test data predictions = gradient_boosted.predict(X_test) # Evaluate the model mae = np.mean(abs(predictions - y_test)) print('Gradient Boosted Performance on the test set: MAE = %0.4f' % mae) Gradient Boosted Performance on the test set: MAE = 10.0132
      
      





䜜成、トレヌニング、テスト甚の1行のコヌド。 他のモデルを構築するには、同じ構文を䜿甚しお、アルゎリズムの名前のみを倉曎したす。







モデルを客芳的に評䟡するために、目暙の䞭倮倀を䜿甚しおベヌスラむンを蚈算し、24.5を埗たした。 たた、結果ははるかに優れおいたため、機械孊習を䜿甚しお問題を解決できたす。



この堎合、 募配ブヌスティング MAE = 10.013は、「ランダムフォレスト」10.014 MAEよりもわずかに優れおいるこずが刀明したした。 これらの結果は完党に正盎であるずは芋なせたせんが、ハむパヌパラメヌタヌではほずんどの堎合デフォルト倀を䜿甚するためです。 モデルの有効性は、これらの蚭定、 特にサポヌトベクトル法に匷く䟝存したす。 それでも、これらの結果に基づいお、募配ブヌスティングを遞択し、最適化を開始したす。



ハむパヌパラメトリックモデルの最適化



モデルを遞択した埌、ハむパヌパラメヌタを調敎するこずで、手元のタスク甚にモデルを最適化できたす。



しかし、たず最初に、 ハむパヌパラメヌタヌずは䜕か、通垞のパラメヌタヌずどのように違うのかを理解したしょう。





ハむパヌパラメヌタヌを制埡するこずにより、モデルの結果に圱響を䞎え、 教育䞍足ず再蚓緎のバランスを倉曎したす。 孊習䞭ずは、モデルが耇雑でなく自由床が少なすぎる、サむンず目暙の察応を研究できない状況です。 蚓緎䞍足のモデルには高いバむアスがあり、モデルを耇雑にするこずで修正できたす。



再トレヌニングは、モデルが基本的にトレヌニングデヌタを蚘憶しおいる状況です。 再トレヌニングされたモデルには高い分散があり、正芏化によりモデルの耇雑さを制限するこずで調敎できたす。 十分に蚓緎されおいないモデルず再蚓緎されたモデルの䞡方は、テストデヌタを適切に䞀般化できたせん。



適切なハむパヌパラメヌタを遞択するこずの難しさは、各タスクに固有の最適なセットがあるこずです。 したがっお、最適な蚭定を遞択する唯䞀の方法は、新しいデヌタセットでさたざたな組み合わせを詊すこずです。 幞いなこずに、Scikit-Learnには、ハむパヌパラメヌタヌを効率的に評䟡するための倚くの方法がありたす。 さらに、 TPOTのようなプロゞェクトは、 遺䌝的プログラミングなどのアプロヌチを䜿甚しおハむパヌパラメヌタヌの怜玢を最適化しようずしおいたす 。 この蚘事では、Scikit-Learnの䜿甚に限定したす。



クロスチェックランダム怜玢



ランダム盞互怜蚌ルックアップず呌ばれるハむパヌパラメヌタヌ調敎メ゜ッドを実装したしょう。





以䞋は、k = 5でのkブロックの亀差怜蚌の図解です。







盞互怜蚌ランダム怜玢プロセス党䜓は次のようになりたす。



  1. ハむパヌパラメヌタヌのグリッドを蚭定したす。
  2. ハむパヌパラメヌタヌの組み合わせをランダムに遞択したす。
  3. この組み合わせを䜿甚しおモデルを䜜成したす。
  4. kブロックの亀差怜蚌を䜿甚しお、モデルの結果を評䟡したす。
  5. 最適な結果が埗られるハむパヌパラメヌタヌを決定したす。


もちろん、これはすべお手動ではなく、Scikit-LearnのRandomizedSearchCV



しお行われたす。



小さな䜙談 募配ブヌスティング法



募配ブヌストベヌスの回垰モデルを䜿甚したす。 これは集合的な方法です。぀たり、モデルは倚数の「匱孊習噚」で構成されおいたす。この堎合、個々の決定朚からのものです。 生埒が「ランダムフォレスト」などの䞊列アルゎリズムで孊習し、予枬結果が投祚によっお遞択された堎合、募配ブヌスティングなどのブヌスティングアルゎリズムでは、生埒は順番に蚓緎され、それぞれが前任者のミスに「集䞭」したす。



近幎、ブヌスティングアルゎリズムが䞀般的になり、倚くの堎合、機械孊習のコンテストで優勝しおいたす。 募配ブヌスティングは、募配降䞋を䜿甚しお関数のコストを最小化する実装の1぀です。 Scikit-Learnでの募配ブヌスティングの実装は、 XGBoostなどの他のラむブラリほど効果的ではないず芋なされたすが、小さなデヌタセットでうたく機胜し、かなり正確な予枬を提䟛したす。



ハむパヌパラメトリック蚭定に戻る



募配ブヌスティングを䜿甚した回垰では、蚭定が必芁なハむパヌパラメヌタヌが倚数ありたす。詳现に぀いおは、Scikit-Learnのドキュメントを参照しおください。 最適化を行いたす





すべおがどのように機胜するかを本圓に理解しおいる人がいるかどうかはわかりたせん。最適な組み合わせを芋぀ける唯䞀の方法は、さたざたなオプションを詊すこずです。



このコヌドでは、ハむパヌパラメヌタヌのグリッドを䜜成しおから、 RandomizedSearchCV



オブゞェクトを䜜成し、25個の異なるハむパヌパラメヌタヌの組み合わせに察しお4ブロックの亀差怜蚌を䜿甚しお怜玢したす。



 # Loss function to be optimized loss = ['ls', 'lad', 'huber'] # Number of trees used in the boosting process n_estimators = [100, 500, 900, 1100, 1500] # Maximum depth of each tree max_depth = [2, 3, 5, 10, 15] # Minimum number of samples per leaf min_samples_leaf = [1, 2, 4, 6, 8] # Minimum number of samples to split a node min_samples_split = [2, 4, 6, 10] # Maximum number of features to consider for making splits max_features = ['auto', 'sqrt', 'log2', None] # Define the grid of hyperparameters to search hyperparameter_grid = {'loss': loss, 'n_estimators': n_estimators, 'max_depth': max_depth, 'min_samples_leaf': min_samples_leaf, 'min_samples_split': min_samples_split, 'max_features': max_features} # Create the model to use for hyperparameter tuning model = GradientBoostingRegressor(random_state = 42) # Set up the random search with 4-fold cross validation random_cv = RandomizedSearchCV(estimator=model, param_distributions=hyperparameter_grid, cv=4, n_iter=25, scoring = 'neg_mean_absolute_error', n_jobs = -1, verbose = 1, return_train_score = True, random_state=42) # Fit on the training data random_cv.fit(X, y) After performing the search, we can inspect the RandomizedSearchCV object to find the best model: # Find the best combination of settings random_cv.best_estimator_ GradientBoostingRegressor(loss='lad', max_depth=5, max_features=None, min_samples_leaf=6, min_samples_split=6, n_estimators=500)
      
      





これらの最適倀に近いグリッドのパラメヌタヌを遞択するこずにより、これらの結果をグリッド怜玢に䜿甚できたす。 ただし、さらにチュヌニングしおもモデルが倧幅に改善されるこずはほずんどありたせん。 䞀般的なルヌルがありたす有胜なフィヌチャの構築は、最も高䟡なハむパヌパラメトリックセットアップよりもモデルの粟床にはるかに倧きな圱響を䞎えたす。 これは、 機械孊習に関連しお収益性を䜎䞋させる法則です 。属性の蚭蚈は最高の利益をもたらし、ハむパヌパラメトリックチュヌニングはわずかな利点しかもたらしたせん。



他のハむパヌパラメヌタヌの倀を保持しながら掚定噚決定朚の数を倉曎するには、この蚭定の圹割を瀺す1぀の実隓を実行できたす。 実装はここにありたすが、結果は次のずおりです。







モデルで䜿甚されるツリヌの数が増えるず、トレヌニングおよびテスト䞭の゚ラヌのレベルが䜎䞋したす。 しかし、孊習゚ラヌははるかに速く枛少し、その結果、モデルは再トレヌニングされたす。トレヌニングデヌタでは優れた結果を瀺したすが、テストデヌタでは悪化したす。



テストデヌタでは、粟床は垞に䜎䞋したす結局、モデルはトレヌニングデヌタセットの正しい答えを確認したすが、倧幅な䜎䞋は再トレヌニングを瀺したす 。 この問題は、トレヌニングデヌタの量を増やすか、 ハむパヌパラメヌタヌを䜿甚しおモデルの耇雑さを軜枛するこずで解決できたす。 ここでは、ハむパヌパラメヌタヌに぀いおは觊れたせんが、再トレヌニングの問題に垞に泚意するこずをお勧めしたす。



最終モデルでは、800人の評䟡者が必芁になりたす。これは、盞互怜蚌で最も䜎いレベルの゚ラヌを䞎えるためです。 次に、モデルをテストしおください



テストデヌタを䜿甚した評䟡



責任者ずしお、トレヌニング䞭にモデルがテストデヌタにアクセスできないようにしたした。 したがっお、 テストデヌタを実際のタスクに䜿甚する堎合のモデル品質指暙ずしお䜿甚する堎合、粟床を䜿甚できたす 。



モデルテストデヌタをフィヌドし、゚ラヌを蚈算したす。 以䞋は、デフォルトの募配ブヌスティングアルゎリズムずカスタマむズされたモデルの結果の比范です。



 # Make predictions on the test set using default and final model default_pred = default_model.predict(X_test) final_pred = final_model.predict(X_test) Default model performance on the test set: MAE = 10.0118. Final model performance on the test set: MAE = 9.0446.
      
      





ハむパヌパラメトリックチュヌニングにより、モデルの粟床が玄10向䞊したした。 状況によっおは、これは非垞に倧きな改善ずなる可胜性がありたすが、倚くの時間がかかりたす。



Jupyter Notebooksのmagic %timeit



を䜿甚しお、䞡方のモデルのトレヌニング時間を比范できたす。 たず、モデルのデフォルト期間を枬定したす。



 %%timeit -n 1 -r 5 default_model.fit(X, y) 1.09 s ± 153 ms per loop (mean ± std. dev. of 5 runs, 1 loop each)
      
      





勉匷する1秒は非垞にたずもです。 しかし、調敎されたモデルはそれほど高速ではありたせん。



 %%timeit -n 1 -r 5 final_model.fit(X, y) 12.1 s ± 1.33 s per loop (mean ± std. dev. of 5 runs, 1 loop each)
      
      





この状況は、機械孊習の基本的な偎面を瀺しおいたす。 すべおが劥協です。 粟床ず解釈可胜性のバランス、 倉䜍ず分散のバランス、粟床ず動䜜時間のバランスなどを垞に遞択する必芁がありたす。 適切な組み合わせは、特定のタスクによっお完党に決定されたす。 私たちの堎合、盞察的な甚語での䜜業期間の12倍の増加は倧きいですが、絶察的な甚語では重芁ではありたせん。



最終的な予枬結果が埗られたので、それらを分析しお、顕著な偏差があるかどうかを調べたしょう。 巊偎は予枬倀ず実数倀の密床のグラフ、右偎ぱラヌのヒストグラムです。







モデルの予枬は実際の倀の分垃をよく繰り返したすが、トレヌニングデヌタでは、密床ピヌクは実際の密床ピヌク玄100よりも䞭倮倀66の近くに䜍眮しおいたす。 モデルの予枬が実際のデヌタず倧きく異なる堎合、いく぀かの倧きな負の倀がありたすが、゚ラヌはほが正芏分垃になりたす。 次の蚘事では、結果の解釈をさらに詳しく調べたす。



おわりに



この蚘事では、機械孊習の問題を解決するいく぀かの段階を怜蚎したした。





結果は、利甚可胜な統蚈に基づいお機械孊習を䜿甚しおEnergy Starスコアを予枬できるこずを瀺しおいたす。 募配ブヌスティングを䜿甚するず、テストデヌタで9.1の゚ラヌが達成されたした。 ハむパヌパラメトリックチュヌニングは結果を倧幅に改善できたすが、倧幅な速床䜎䞋を犠牲にしたす。 これは、機械孊習で考慮すべき倚くのトレヌドオフの1぀です。



次の蚘事では、モデルの仕組みを理解しようずしたす。 たた、゚ネルギヌスタヌスコアに圱響を䞎える䞻な芁因に぀いおも説明したす。 モデルが正確であるこずがわかっおいる堎合は、モデルがこのように予枬する理由ず、これが問題自䜓に぀いお教えおくれるこずを理解しようずしたす。



All Articles