scikit-learnで線形回帰分析

scikit-learnで回帰分析をしたくて数日ネットで調べていたのですが、やっとなんとなくわかりはじめたので備忘録として書いておきます。

赤ワインのデータを使って試しにやってみます。

CSVデータはココ↓
http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv

ダウンロードしたCSVデータはpythonのフォルダに入れておきます。
このCSVデータは開いてみればわかるとおりセミコロンでデータが区切られています。CSVは通常その名の通りコンマで区切られているので、セミコロンをコンマに変換する必要があります。
メモ帳でCSVデータを開き、編集→置換 でセミコロンをコンマに一括で置き換えます。

f:id:tabascolabo:20171122183940j:plain


このCSVデータ内にはあるワインのpH、クエン酸濃度、アルコール度数、クオリティなどワインの成分や要素が入っており、合計でワイン1599個分のデータがあります。

今回行うのは、ワインのクオリティと、その他の要素の相関関係の分析です。ワインの成分構成から、誰かに実際にワインを試飲させずにクオリティを予想できちゃう計算式を導きだそうというわけです。

とりあえずプログラムは以下のように書きます。

----------------------------------------------------------
import pandas as pd
from sklearn import linear_model

data = pd.read_csv("winequality-red.csv")

wine_elements = data.drop("quality", axis=1)

X = wine_elements.as_matrix()
Y = data["quality"].as_matrix()

clf = linear_model.LinearRegression()

clf.fit(X, Y)

print(pd.DataFrame({"Element":wine_elements.columns,

"Coefficients":clf.coef_}).sort_values(by='Coefficients') )

print(clf.score(X, Y))

----------------------------------------------------------

ひとつずつ解説をしていきます。

import pandas as pd
from sklearn import linear_model
pandasというライブラリを使うので、インポートしておきます。
今回scikit-learnで使うのは、リニアモデルという線形の回帰分析です。
理由は線形が一番単純で練習にちょうどいいからです。

data = pd.read_csv("winequality-red.csv")
フォルダ内にあるCSVファイルを読み込みます。
この読み込んだCSVファイルはdataという名前にしておきます。

wine_elements = data.drop("quality", axis=1)
「クオリティ」を予想できるように学習させたいので、先ほどのCSVファイルから「クオリティ」の部分だけのデータ(=答えのデータ)と、「クオリティ以外のすべての要素」のデータ(=問題のデータ)が必要です。先ほどのdataと名付けたものからqualityの部分を削除し、「クオリティ以外のすべての要素」のデータを作るのがこの一文です。名前はwine_elements(ワインの要素)とでもしておきます。

X = wine_elements.as_matrix()
Y = data["quality"].as_matrix()
wine_elements (ワインの要素)を問題のデータとしてX、dataからクオリティの部分だけを取り出したものを答えのデータとしてYに入れます。最後に.as_matrix()がくっついているのは、学習データはarrayでないといけないためです。

clf = linear_model.LinearRegression()
clf.fit(X, Y)
線形回帰で学習させます。

print(pd.DataFrame({"Element":wine_elements.columns,
"Coefficients":clf.coef_}).sort_values(by='Coefficients') )
結果をpandasを使って表みたいに表示させます。
要素のクオリティに対する影響の大きい順に並べています。

print(clf.score(X, Y))
精度を表示させます。

実際に実行してみるとこんな感じになるはずです↓

f:id:tabascolabo:20171122184016j:plain


この結果が意味しているのは、クオリティを求める式は、それぞれの要素に左側の少数をかけて、それらの和、ということです。
最後の少数は精度です。1が最大なので、精度が糞だということがわかります。

参考
http://pythondatascience.plavox.info/scikit-learn/%E7%B7%9A%E5%BD%A2%E5%9B%9E%E5%B8%B0
https://qiita.com/kotaroito/items/4eb29d42d7f8c534332f
http://publicjournal.hatenablog.com/entry/2017/02/25/104834