.net column
.NET開発者のためのブログメディア

scikit-learnとは?scikit-learnを使って機械学習を実践しよう

2021年05月28日
SE
Pythonの機械学習ライブラリであるscikit-learnの使い方を教えてください。
PM
分かりました。scikit-learnを使った機械学習について解説いたしましょう。

scikit-learnとは?


scikit-learnとは、プログラミング言語Pythonを用いてオープンソースで開発された機械学習ライブラリです。機械学習とはコンピュータが自動的に反復的にデータを学習し、そのデータに潜むパターンを見つけ出すことです。

ここではscikt-learnを利用してデータ解析のいろはのいを学んでいきます。

scikit-learnのインストール

それではscikit-learnをインストールします。開発環境はWindows 10、Python3です。Pythonのライブラリ、NumPy、matplotlib、pandasがインストールされているものとします。

もし、ライブラリがインストールされていなければ、これからscikit-learnをインストールするため、同じようにpipでインストールしてください。PowerShellを立ち上げます。

これでインストール完了です。

データセットの準備

scikit-learnにはBoston house prices datasetという、米国ボストンの506の地域毎の住環境から作られたデータセットがデフォルトで収録されています。このデータセットを使って機械学習のさわりを学んでいきます。

元データは次のboston.txtです。そこに、

という属性があります。

回帰問題

上記のデータセットの属性のMEDVを除いた13の指標から、MEDVを予測するという回帰問題を行ってみましょう。このデータセットはscikit-learnのload_boston()関数で呼び出すことが可能です。

読み込んだデータセットはdateとtargetという属性を持っています。それぞれに入力値と目標値を並べたdnarrayに格納されています。これをx、tとして格納します。

データセットの確認

入力値が格納されたxは506個の13次元ベクトルでデータが格納されていて、tにはデータが506次元ベクトルで格納されています。

これをsample.pyとして作業フォルダに保存します。

このように出力されれば、OKです。

データセットの分割

データセットを訓練用とテスト用に分割します。機械学習では訓練用としてコンピュータに学習させておき、テスト用のデータセットから解析する作業を行います。このデータの分割はホールドアウト法と呼ばれていて、scikit-learnにはその関数が用意されています。

これがコンパイル可能かどうか確認すると、コンパイルが通ります。ここでtrain_test_split()関数の引数test_sizeに0.3を指定したことでテスト用データセットの割合は30%に、残りの70%は自動的に訓練用データセットに割り当てられます。

モデル・目的関数・最適化手法を決定する

scikit-learnで重回帰分析を行う場合、LinerRegressionクラスを使用します。scikit.liner_model以下のLinerRegressionクラスを読み込んでインスタンスを作ります。

LinerRegressionは最小二乗法を行うクラスで、目的関数や最適化手法があらかじめ用意されているのです。

モデルの訓練

scikit-learnにはモデルの訓練用に用意されているものにfit()メソッドがあります。fit()メソッドは再利用可能なコードが書きやすくなっています。reg_modelを用いて訓練をする場合、fit()メソッドの引数に入力値x、目標値tを指定します。

パラメータの確認

重回帰分析では重みのパラメータはw、バイアスのパラメータはbです。求められたwの値はmodel.coef_に、bの値はmodel.intercept_に格納されています。次のプログラムで値を確認してみます。

以下の通りに出力されました。

精度の検証

モデルの訓練が終わったら、精度の検証を行います。LinerRegressionクラスにはscore()メソッドが提供されていて、これにより入力値と目標値を与えると訓練済みのモデルを用いて計算された決定係数(coefficient of determination)という指標を返します。

検証のソースコードは次の通りです。

次のように値が出力されました。

つまり、決定係数はおよそ0.765ということです。

推論

新たな入力値を与えて、予測値を計算させるにはpredict()メソッドを利用します。

ここではreg_modelからサンプルを1つ取り出して推論を行います。このとき、predict()メソッドに与える入力値のdnarrayの形は(サンプルサイズ, 各サンプルの次元数)になっていることが必要です。

これは次のように出力されます。

この入力値に対して目標値は次の通りです。

これは次のように出力されました。

つまり、22.6の目標値に対して先に出力で見たおよそ24.94という予測値が返ってきたことになります。

テスト用データセットでの評価

訓練済みモデルの性能を、テスト用データセットでの決定係数を計算することで評価してみます。

これは次のように出力されました。

先に算出した訓練用データセットでの値、0.765よりも低い値が出てしまいました。予測値と目標値の差が大きくなってしまう現象を過学習といいます。

前処理による改善

前処理(preprocession)とは、欠損値の補完や正規化などの処理を訓練の開始前にデータセットに対して行うことです。ここでは入力変数ごとに平均が0,分散が1になるように標準化(standardization)を行います。

scikit-learnには、sklearn.preprocessingというモジュール以下にStandardScalerクラスが定義されています。このクラスを用いて標準化を行います。次のコードをsample.pyの先頭に書き足します。

StandardScalerクラスのインスタンスを作るのです。そして、fit()メソッドを用いて平均・分散の値を計算します。

計算された平均値がmean_属性に、分散値がvar_属性に格納されます。それを確認してみましょう。

これは次の通りに出力されました。

これらの平均値・分散値を使ってデータセットを標準化するにはtransform()メソッドを使います。

これは次のように出力され、標準化できていません。

べき変換による標準化

べき変換を用いて別の前処理を行います。ソースコードは次の通りです。最初の箇所を変えています。

これは次のように出力されました。

警告は出ましたが、過学習は補正されています。

パイプライン化

前処理のときにscaler、重回帰分析を行うreg_modelは、ともにfit()メソッドを用いますが、scikit-learnではパイプラインという統一する機能があります。ソースコードは次の通りです。

これは次のように出力されました。

過学習は補正されて標準化されました。パイプラインを使うとx_train_scaledなどの中間変数を使うことなく、コードが簡素化されます。コードが簡素化されるとミスが格段に減るた為、パイプライン化はこの場合有効です。

SE
機械学習に興味があるので、scikit-learnは何とか習得したいですね。
PM
今回は重回帰解析を取り上げてscikit-learnの使い方を解説しましたが、機械学習に興味があるならぜひscikit-learnを学んでみてください。

scikit-learnを使って機械学習を実践しよう

Pythonの機械学習ライブラリのscikit-learnを使うと、様々な機械学習が簡単にできます。ここではほんの一部の重回帰解析という機械学習を取り上げました。機械学習に興味のある方は色々なパターンの機械学習をscikit-learnで実践してみて下さい。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags