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
白ワインのデータもあります。
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が品質ベスト
線形回帰モデルで目的変数としてアルコール度数の値を予測
# 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の相関を測る。
plt.scatter(X, Y) # 散布図
plt.plot(X, clf.predict(X), 'r') # 回帰直線
plt.grid()
plt.show()
線形回帰モデルで目的変数として品質の値を予測
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の相関を測る。
scatter_matrix(wine, hist_kwds = {'bins': 20}, color = 'g', figsize = (10,10))
plt.show()
データを正規化してから予測する
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)) # 決定係数
複数の分類器を使って精度を高めるランダムフォレスト手法を用いる
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))