はじめに
ランダムフォレストでワインの品質判定をやってみたので、紹介します。
そもそもランダムフォレストとは何なのか?
ランダムフォレストは、多数の決定木を使って予測を行うアンサンブル学習アルゴリズムである。
それぞれの決定木は、訓練データからランダムにサンプルを抽出したデータセットで学習する。(ブートストラップサンプリング)
プログラム
基本的には前回記事と同じです。
ワインの特徴量と品質が記されたデータセットをURLから持ってきて、
特徴量からワインの品質を求めるようなプログラムになってます。
ランダムフォレストという機械学習の手法を使っております。
# 必要なライブラリのインポート
import numpy as np # 数値計算を効率的に行うためのライブラリ
import pandas as pd # データ分析を容易にするためのライブラリ
from sklearn.ensemble import RandomForestClassifier # ランダムフォレストモデルを使用するためのライブラリ
from sklearn.model_selection import train_test_split # データを訓練用とテスト用に分割するためのライブラリ
from sklearn.preprocessing import StandardScaler # データの標準化を行うためのライブラリ
from sklearn.metrics import accuracy_score # 正解率を計算するためのライブラリ
# データセットの読み込み
df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv', sep=';') # ウェブ上のデータセットを読み込む
# データの前処理
df = df.replace('?', np.nan).dropna() # '?'を欠損値として扱い、欠損値を含む行を削除
for column in df.columns:
df[column] = df[column].astype(float) # 全ての列のデータタイプを浮動小数点数に変換
# 品質をカテゴリ変数に変換
df['quality'] = pd.Categorical(df['quality']) # 'quality'列のデータをカテゴリ変数に変換
# 特徴量と目的変数の指定
X = df.drop('quality', axis=1) # 'quality'列を除いたデータを特徴量として指定
y = df['quality'].cat.codes # 'quality'列のカテゴリコードを目的変数として指定
# データの標準化
scaler = StandardScaler() # 標準化を行うためのインスタンスを作成
X_scaled = scaler.fit_transform(X) # 特徴量データを標準化
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=0) # データを訓練用とテスト用に分割
# ランダムフォレストモデルの構築
rf_model = RandomForestClassifier(n_estimators=100, random_state=0) # ランダムフォレストモデルのインスタンスを作成
# モデルの訓練
rf_model.fit(X_train, y_train) # 訓練データを使ってモデルを訓練
# モデルの評価
train_predictions = rf_model.predict(X_train) # 訓練データに対する予測
test_predictions = rf_model.predict(X_test) # テストデータに対する予測
# 正解率の計算
train_accuracy = accuracy_score(y_train, train_predictions) # 訓練データの正解率を計算
test_accuracy = accuracy_score(y_test, test_predictions) # テストデータの正解率を計算
# 結果の表示
print(f'正解率(train): {train_accuracy:.3f}') # 訓練データの正解率を表示
print(f'正解率(test): {test_accuracy:.3f}') # テストデータの正解率を表示
実行結果
実行結果は以下のような感じでした。
正解率70.9%っすね。
C:\Python\wine\rf>python rf1.py
正解率(train): 1.000
正解率(test): 0.709
Q. なんで70%しか出ないのか・・・?
どうやらワインのデータに原因があるらしい。
ワインのデータ内に、品質の偏りがあるらしい。。。
(↓の記事に分かりやすく書いてありました。)