Python AI 画像

scikit-learnを用いて機械学習を行います。ここでは、有名な赤ワインデータのデータを用いて、ワインの品質を判定します scikit-learnを使用するには、Anacondaの開発環境パッケージを用いるのが簡単です。scikit-learnが含まれています。なお、Numpy、Scipy、Pandas等もインストールしてください。Anacondaの場合、conda install numpy等でインストールできます。

In [1]:
import pandas as pd
from pandas.plotting import scatter_matrix
import numpy as np
import matplotlib.pyplot as plt # matplotlib パッケージを読み込み
from sklearn import linear_model
from sklearn import model_selection
from sklearn.ensemble import RandomForestClassifier

赤ワインのデータを読み込みます。インターネット上にたくさんありますので、事前にダウンロードしておいてください
例えば、http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality.names
白ワインのデータもあります。

In [2]:
wine = pd.read_csv("winequality-red.csv", sep = ";")
#wine.head()
wine.tail()
# fixed acidity 酒石酸濃度(不揮発性)
# vlatile acidity 酢酸濃度(揮発性)
# citric acid クエン酸濃度
# residual sugar 残糖濃度
# chlorides 塩化ナトリウム濃度
# free sulfur dioxide 遊離SO2濃度
# total sulfer dioxide 総SO2濃度
# density 密度
# pH
# suphates 硫化カリウム濃度
# alochol アルコール度数
# quality 品質 0~10で評価されており、10が品質ベスト
Out[2]:
fixed acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density pH sulphates alcohol quality
1594 6.2 0.600 0.08 2.0 0.090 32.0 44.0 0.99490 3.45 0.58 10.5 5
1595 5.9 0.550 0.10 2.2 0.062 39.0 51.0 0.99512 3.52 0.76 11.2 6
1596 6.3 0.510 0.13 2.3 0.076 29.0 40.0 0.99574 3.42 0.75 11.0 6
1597 5.9 0.645 0.12 2.0 0.075 32.0 44.0 0.99547 3.57 0.71 10.2 5
1598 6.0 0.310 0.47 3.6 0.067 18.0 42.0 0.99549 3.39 0.66 11.0 6

線形回帰モデルで目的変数としてアルコール度数の値を予測

In [3]:
# sklearn.linear_model.LinearRegression クラスを読み込み
clf = linear_model.LinearRegression()
 
# 説明変数に "density (濃度)" を利用
X = wine.loc[:, ['density']].values # as_matrix() is deprecated
# 目的変数に "alcohol (アルコール度数)" を利用
Y = wine['alcohol'].values # as_matrix() is deprecated

clf.fit(X, Y) # 予測モデルを作成

print('coef:', clf.coef_) # 回帰係数
print('intercept:', clf.intercept_) # 切片 (誤差)
print('score:', clf.score(X, Y)) # 決定係数、予測値Xと正解値Yの相関を測る。
coef: [-280.16382307]
intercept: 289.67534338256445
score: 0.2461943643971065
In [4]:
plt.scatter(X, Y) # 散布図
plt.plot(X, clf.predict(X), 'r') # 回帰直線
plt.grid() 
plt.show()

線形回帰モデルで目的変数として品質の値を予測

In [5]:
clf = linear_model.LinearRegression()
 
wine_except_quality = wine.drop("quality", axis = 1) # 説明変数に "quality"以外を利用、axis=1:列
X = wine_except_quality.values
Y = wine['quality'].values # 目的変数に "quality (品質スコア)" を利用

clf.fit(X, Y) # 予測モデルを作成
 
# 偏回帰係数
print(pd.DataFrame({"Name":wine_except_quality.columns,
                    "Coefficients":clf.coef_}).sort_values(by='Coefficients') )
print('intercept:', clf.intercept_) # 切片 (誤差)
print('score:', clf.score(X, Y)) # 決定係数、予測値Xと正解値Yの相関を測る。
                    Name  Coefficients
7                density    -17.881164
4              chlorides     -1.874225
1       volatile acidity     -1.083590
8                     pH     -0.413653
2            citric acid     -0.182564
6   total sulfur dioxide     -0.003265
5    free sulfur dioxide      0.004361
3         residual sugar      0.016331
0          fixed acidity      0.024991
10               alcohol      0.276198
9              sulphates      0.916334
intercept: 21.965208449451893
score: 0.3605517030386881
In [6]:
scatter_matrix(wine, hist_kwds = {'bins': 20}, color = 'g', figsize = (10,10))
plt.show()

データを正規化してから予測する

In [7]:
clf = linear_model.LinearRegression()
 
# データフレームの各列を正規化
wine2 = wine.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))
wine2.head()

wine2_except_quality = wine2.drop("quality", axis = 1) # 説明変数に "quality (品質スコア以外すべて)" を利用
X = wine2_except_quality.values
Y = wine2['quality'].values # 目的変数に "quality (品質スコア)" を利用
 
clf.fit(X, Y) # 予測モデルを作成
 
# 偏回帰係数
print(pd.DataFrame({"Name":wine2_except_quality.columns,
                    "Coefficients":np.abs(clf.coef_)}).sort_values(by='Coefficients') )
 
print('intercept:', clf.intercept_) # 切片 (誤差)
print('score:', clf.score(X, Y)) # 決定係数
                    Name  Coefficients
2            citric acid      0.036513
3         residual sugar      0.047687
7                density      0.048708
0          fixed acidity      0.056479
5    free sulfur dioxide      0.061931
8                     pH      0.105068
6   total sulfur dioxide      0.184775
4              chlorides      0.224532
9              sulphates      0.306056
1       volatile acidity      0.316408
10               alcohol      0.359057
intercept: 1.914074291327531e-16
score: 0.3605517030386882

複数の分類器を使って精度を高めるランダムフォレスト手法を用いる

In [8]:
wine_except_quality = wine.drop("quality", axis = 1) # 説明変数に "quality"以外を利用、axis=1:列
X = wine_except_quality.values
Y = wine['quality'].values # 目的変数に "quality (品質スコア)" を利用
# データを学習用とテスト用に分割する
X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size = 0.2)
 
# データを学習
clf = RandomForestClassifier(n_estimators = 100) # n_estimators default will be 100 from 10
#clf = RandomForestClassifier()
clf.fit(X_train, Y_train)
 
# 予測して精度を確認する
Y_pred = clf.predict(X_test)
print('Test Predict:\n', Y_pred)
print('Train score:', clf.score(X_train, Y_train))
print('Test score: ', clf.score(X_test, Y_test))
Test Predict:
 [5 6 6 6 7 5 5 5 6 6 7 6 6 6 5 5 6 5 6 6 5 5 6 5 5 7 5 5 7 6 6 5 5 5 5 6 5
 5 6 6 5 5 5 6 5 6 6 5 5 7 5 5 5 6 6 6 6 5 5 5 6 5 6 5 6 5 5 5 4 6 6 7 5 6
 5 6 6 5 6 5 5 6 5 6 5 5 6 5 5 6 7 7 5 6 7 6 5 5 5 5 5 7 5 5 6 6 6 5 5 6 6
 5 6 6 4 6 8 6 5 5 6 5 5 6 5 6 5 5 6 5 6 5 6 5 5 5 6 6 6 6 6 6 5 6 5 5 5 5
 5 5 6 5 6 6 6 6 6 5 6 7 5 5 7 6 6 5 5 5 5 5 6 5 5 5 6 6 7 6 5 6 6 5 5 5 5
 6 5 5 6 6 6 6 5 5 6 6 5 7 5 5 6 6 5 5 6 5 6 5 6 6 5 7 6 6 5 6 6 5 5 5 5 5
 6 6 5 6 6 5 6 7 6 7 5 6 6 6 5 6 6 6 5 6 6 7 5 6 5 7 6 6 5 6 6 7 6 6 6 6 5
 5 5 6 7 6 5 5 5 6 7 7 6 5 6 7 5 5 6 5 6 6 5 6 6 5 6 5 5 7 6 5 6 6 6 5 5 6
 5 6 5 6 6 5 6 5 5 5 5 7 5 7 5 6 5 6 5 7 7 6 7 5]
Train score: 1.0
Test score:  0.68125
In [ ]: