今回の記事はデータサイエンス入門の機械学習編第5回です.(講座全体の説明と目次はこちら)
追記)機械学習超入門動画講座を公開しました!動画で効率よく学習をしたい人はこちら(現在割引クーポン配布中です)
線形回帰モデルの構築のアルゴリズムとして,第3回では最急降下法,第4回では正規方程式を使った方法を紹介しました.
今回の記事では,scikit-learnというPythonの機械学習に特化したライブラリを使って,簡単に学習データから線形回帰モデルを構築するやり方を紹介します!
線形回帰にかかわらず,基本的に機械学習モデルを構築する際にはscikit-learnを使って同じように構築することになるので,今回の記事の内容は超基本かつ超重要ですので是非おさえてください!
目次
scikit-learnとは?
scikit-learnは,Pythonの機械学習に特化したライブラリです.Pythonで機械学習をする上では避けては通れないライブラリであり,scikit-learnを使いこなせれば,Pythonで簡単に機械学習のモデルを構築したり,モデルを評価できるようになります.
アルゴリズムの内容を理解していなくても,モデルを構築するだけならscikit-learnのコードを数行書けばできるわけです.
そう思う人も多いかもしれませんが,それは間違いです.モデル構築の際には様々なパラメータを指定することになりますが,それらがなにを意味するのか,どうアルゴリズムに影響があるのかは,きちんとアルゴリズムの中身を理解していないと使えませんよね?
理想は「アルゴリズムの中身もわかるし,scikit-learnを使って素早くモデルを構築できる」です.それを意識しつつscikit-learnでの実装を学びましょう!
scikit-learnのインストール
scikit-learnは,データサイエンスのためのPython講座第1回で紹介したAnacondaに入っているので,そちらの記事で環境構築している人は特にscikit-learnのインストールは不要です.
そうでない人は,公式ドキュメントを参考に自分の環境に合わせてインストールしてください.
大抵の場合は $pip install scikit-learn で問題なくインストールできるでしょう
scikit-learnのimport
他のライブラリ同様,scikit-learnを使うにはimportが必要です.
scikit-learnは, sklearn というライブラリ名でimportすることが可能です.
1 |
import sklearn |
とすれば, sklearn に . (ドット)と繋げてscikit-learnの様々なモジュールやクラス,関数にアクセスできるようになります.
scikit-learnは大きなライブラリなので,機械学習のモデル毎にモジュールが細分化されています.(NumPyやPandasだと,np.やpd.に繋げる形で簡単にモジュールにアクセスできましたが,scikit-learnでは何段階かモジュールを経由したりします.)
なので,使うモジュールやクラスを特定する形でimport文を書くのが一般的です.
どこにどんなモジュールやクラスがあるかは,本講座を進めていく上で徐々に学んでいけばOKです.また,必要な時に適宜ググって調べればいいでしょう◎
本記事で扱う線形回帰モデルを構築するには, sklearn.linear_model.LinearRegression というクラスを使います.
なので,以下のようにimportしておきましょう!
1 |
from sklearn.linear_model import LinearRegression |
scikit-learnを使って線形回帰モデルを構築する
それでは早速scikit-learnを使って線形回帰のモデルを学習させてみましょう!
1. クラスのインスタンスを生成する
まずはLinearRegressionクラスからインスタンスを生成します.
この辺りはオブジェクト指向のプログラミングになるので,オブジェクト指向がわかっていないと,少しコードを理解するのが難しいかもしれません.オブジェクト指向についてはPythonの入門講座で詳しく解説しているので,もしオブジェクト指向はさっぱりわからない!という方は是非この講座で勉強してみてほしいです.
インスタンス生成は簡単で,以下のようにクラス名のあとに () をつけてcallしてあげればOKです.今回は model というインスタンスを作って,今後の操作は model を使って行えるようにします.
1 |
model = LinearRegression() |
2. 学習データを準備する
前回の記事と同様,diamondsデータセットを学習データに使いましょう!特徴量はcaratのみとし,目的変数はpriceにします.異常値のデータを排除したデータセットで学習させます.
1 2 3 4 5 |
import seaborn as sns df = sns.load_dataset('diamonds') df = df[(df[['x','y','z']] != 0).all(axis=1)] X = df['carat'].values y = df['price'].values |
通常特徴量は X ,目的変数は y という変数にセットしておきます.通常特徴量は複数あることを想定すると,前回の記事で行列式をお見せしたように,データ数m\(\times\)特徴量数\(n+1\)の行列になることが考えられるので,大文字の X を使います. y は,目的変数一つのみになるので,ベクトルの意味を込めて小文字にします.
今回は特徴量がcaratのみということもあり, X も y もshapeが以下のようになり,ベクトルの形になっています.
1 |
print(X.shape, y.shape) |
1 |
(53920,) (53920,) |
scikit-learnを使う際の学習データは, X は\(m\times n\)の形にする必要があるので,以下のようにreshapeしておきます.
1 2 |
X = X.reshape(-1, 1) print(X.shape) |
1 |
(53920, 1) (53920, 1) |
すると,多次元arrayの形になり,これで正しい学習データのフォーマットとなりました.
3. 学習する
学習をするには, .fit() メソッドを model インスタンスに対してcallすればOKです.引数として学習データの X と y を渡してあげましょう.
1 |
model.fit(X, y) |
基本的には .fit() は,numpy arrayの形のデータを引数として受け取ると思っておきましょう. X はshapeが(データ数, 特徴量数)の行列arrayで y は各データの正解の値の一次元のarrayです.
これで, model は学習済みのインスタンスとなりました.
4.学習済みのモデルのパラメータを確認する
線形回帰モデルは,今までの記事で解説した通り(\(\hat{f}(X)=\theta_0+\theta_1X_1+\cdots+\theta_nX_n\))という数式のモデルです.学習をしたことで,各\(\theta\)の値が一意に定まりました.
これらの値を確認するには,線形回帰では .coef_ と .intercept_ にアクセスすればOKです.
1 |
print(model.coef_, model.intercept_) |
1 |
[7755.76725406] -2255.768787037976 |
切片と傾きの係数をそれぞれ英語でinterceptとcoefficientということからも分かりやすいと思います.
係数は\(\theta_1, \cdots, \theta_n\)と複数あるのでリストになっていますが,切片は特徴量の数に限らず一つ(\(\theta_0\))なので単一の値になっています.
これらの数字は前回の記事でやった正規方程式の結果(\(price=-2255.76878704+7755.76725406\times carat\))と同じになっているのが分かります.scikit-learnの線形回帰は,裏では正規方程式を実行しているだけなんですね!
5. 新たなデータで予測をする
機械学習のモデルを構築する目的は,未知のデータに対して予測値を取得することです.
例えば今回の例では,「カラット」の情報がわかれば,大体の「金額」の値を予測することができます.(例えば自分の家にあるダイヤを売りたいと考えた時に,このモデルを使えば売値の目安を知ることができるでしょう.)
予測をするには .predict() メソッドを使います.
1 2 3 |
import numpy as np X_new = np.array(2).reshape(-1, 1) model.predict(X_new) |
1 |
array([13255.76572108]) |
今回は試しにカラット=2のデータに対して価格予測を行いました.すると結果は13255ドル,つまり2カラットのダイヤは約150万円というのが今回の学習したモデルが出した予測値です.
線形回帰モデルの説明変数はあくまでもデータ数\(m\times\)特徴量数\(n\)の形なので, .reshape(-1, 1) で多次元arrayの形にしておきます.(これは学習データの処理と同じですね)
予測の結果もリストで得られることに注意しましょう.複数のデータを一気に予測できるわけです.
これが最も基本的なscikit-learnでのモデル構築の一連の流れです!今後の記事でも色々なアルゴリズムを紹介しますが,ほとんどがこの流れになるので,覚えておきましょう!
まとめ
今回はscikit-learnというPythonの機械学習用ライブラリを使って最も基本的なアルゴリズムである線形回帰モデルを学習してみました.
scikit-learnを使えばめちゃくちゃ簡単にモデル構築ができることがわかったのではないでしょうか?
今回の内容を抑えておけば,あとは使うクラスを変えるだけでほとんどのアルゴリズムを使ってモデルを構築することができます.(もちろん,それぞれのアルゴリズムによってパラメータなどが変わってきますが)
この辺りは今後の記事で色々と紹介していくので楽しみにしてください!
- scikit-learnはPythonの機械学習に特化したライブラリ
- モデルの学習はオブジェクト指向を使って行うのが一般的
- .fit() メソッドで学習をする(引数のshapeに注意する)
- 線形回帰モデルでは .coef_ と .intercept_ 属性にアクセスすることでモデルのパラメータを確認できる
- .predict() メソッドで任意のデータに対してのモデルの結果(予測値)を取得できる
次回の記事では,前回の記事や今回の記事で得られたモデル(\(price=-2255.76878704+7755.76725406\times carat\))についてもう少し詳しく解説していきます.これらのパラメータの数字はなにを意味するのか? 今後の記事でさらに線形回帰について詳しく解説していく予定です!
モデルの構築をするくらいなら誰での簡単にできるんですが,そのモデルの解釈をきちんとできる人はそう多くないです.是非このまま講座を進めてください!
それでは!