見出し画像

「回帰分析から学ぶ計量経済学」をPythonで写経 ~ 第6章「機械学習への道」①分類:あやめデータセット

第6章「機械学習への道」

書籍の著者 山澤成康 先生


この記事は、書籍「回帰分析から学ぶ計量経済学」第6章「機械学習への道」の Python写経活動 を取り扱います。

今回は第6章冒頭で紹介されている「あやめデータセット」を用いて、同じく6章で紹介の機械学習アルゴリズムを利用して、機械学習を実践します。
では書籍を開いて回帰分析の旅に出発です🚀

子供達の飛行機旅行のイラスト(修学旅行):「いらすとや」さんより

はじめに


書籍「回帰分析から学ぶ計量経済学」のご紹介

このシリーズは書籍「回帰分析から学ぶ計量経済学: Excelで読み解く経済のしくみ」(オーム社、「テキスト」と呼びます)の Python 写経です。

テキストは、2023年11月に発売され、副題「Excelで読み解く経済のしくみ」のとおり、主に Excel を用いて、計量経済学を平易に学べる素晴らしい書籍です。
テキストの「はじめに」に著者の先生が執筆の動機を書かれています。

社会人の統計リテラシーの向上をテーマの1つとした科研費プロジェクトの最終年度で、広く社会人に向けてわかりやすい経済分析の本を書きたかったのです。

テキストより引用

私にとって計量経済学は高嶺の花ですが、このテキストでさまざまな回帰分析のアプローチを知ることができました。
また、書籍の Excel 処理を Python に置き換える「寄り道写経」の実践を通じて、回帰分析のお気持ちに少し近づけた感じがいたします。

回帰分析に慣れ親しむのに丁度良いレベル感と内容ですので、これはぜひともブログにしたい!と思って現在に至ります。
計量経済学の色を薄め、データ分析の色を濃いめに書いてまいります!

データ分析のイラスト:「いらすとや」さんより

引用表記

この記事は、出典に記載の書籍に掲載された文章と配布データを引用し、適宜、掲載文章・配布データを改変して書いています。
【出典】
「回帰分析から学ぶ計量経済学: Excelで読み解く経済のしくみ」
第1版第1刷、著者 山澤成康、オーム社

記事中のイラストは、「かわいいフリー素材集いらすとや」さんのイラストをお借りしています。
ありがとうございます!


第6章 機械学習への道


この記事は第6章の6.2~6.4節で紹介される以下のアルゴリズムで、あやめデータセットの分類タスクを実践いたします。

・ロジスティック回帰
・決定木
・K近傍法
・サポートベクターマシン
・ニューラルネットワーク
・ナイーブベイズ
・ランダムフォレスト

記事に用いるデータは、オーム社の書籍紹介サイトからダウンロードできる Excel ファイル内のデータをもとにしてCSVファイルを作成し、data フォルダに格納しています。

第6章で用いるライブラリをインポートします。

### インポート

## 数値計算
import numpy as np
import pandas as pd

## 統計
import scipy.stats as stats

## 機械学習
# irisデータセット
from sklearn.datasets import load_iris
# データの準備
from sklearn.model_selection import train_test_split  # 学習・テストデータの分割
# 交差検証
from sklearn.model_selection import StratifiedKFold   # 層化Kfold交差検証
from sklearn.model_selection import cross_validate    # CVによる学習実行
# 分類アルゴリズム
from sklearn.linear_model import LogisticRegression   # ロジスティック回帰
from sklearn.tree import DecisionTreeClassifier       # 決定木
from sklearn.neighbors import KNeighborsClassifier    # K近傍法
from sklearn.svm import SVC                           # サポートベクターマシン
from sklearn.naive_bayes import GaussianNB            # ナイーブベイズ
from sklearn.ensemble import RandomForestClassifier   # ランダムフォレスト
from sklearn.decomposition import PCA                 # 主成分分析
from sklearn.cluster import KMeans                    # k-means法
from sklearn.cluster import AgglomerativeClustering   # 階層分析
# 評価
from sklearn.metrics import accuracy_score            # 正解率
from sklearn.metrics import classification_report     # 分類評価レポート
from sklearn.metrics import confusion_matrix          # 混同行列
from sklearn.tree import plot_tree                    # 決定木の描画

## 描画
import matplotlib.pyplot as plt
import seaborn as sns
import japanize_matplotlib

データの読み込み

あやめデータセットはデータ分析の練習に頻繁に用いられるデータセットです。
Wikipedia で紹介されています!
(花画像は上から setosaversicolorvirginica です。)

scikit-learn が用意するあやめデータセットを読み込みます。

### データの読み込み

# データセットの取得
iris = load_iris()

# データフレーム化
df = pd.DataFrame(np.hstack([iris.data, iris.target.reshape(-1, 1)]),
                  columns=iris.feature_names + ['class'])
df['class'] = df['class'].astype(int)

# アヤメの名前の取得
iris_names = iris.target_names

# 結果の表示
print('df.shape: ', df.shape)
display(df.head())
print('iris_names: ', iris_names)

【実行結果】
標本サイズ150、前半の4つの変数を説明変数とし、最後の「class」を目的変数にします。
class はあやめの種類であり、 0 : setosa、1 : versicolor、2 : virginica です。

散布図であやめの種類を識別して描画します。

### 散布図の描画

# 描画領域の設定
fig, ax = plt.subplots()
# クラス別の散布図の描画
sns.scatterplot(data=df, x='petal length (cm)', y='petal width (cm)',
                hue='class', palette=['tab:blue', 'tab:red', 'tab:green'], ax=ax)
# 凡例処理
handles, _ = ax.get_legend_handles_labels()
ax.legend(handles=handles, labels=iris_names.tolist(), title='class');

【実行結果】
setosa(青い点)は分離独立しています。
versicolor(赤い点)と virginica(緑の点)は境界線が若干曖昧な感じがします。

ではでは、sepal length(がく片の長さ)、sepal width(がく片の幅)、petal length(花弁の長さ)、petal width(花弁の幅)の4つの説明変数を使って、あやめの種類「class」を予測する分類モデルをバリバリ作っていきます!

なお、機械学習の各アルゴリズムの内容は、ぜひテキストを手にとってお読みくださいませ。

ロジスティック回帰 p.189

■ データの前処理
二値分類タスクを実践します。
class を 1 : virginica、0 : その他 に変換します。

### データの前処理 virginicaかその他かの二値分類に変更

# 分類するアヤメの種類を設定
kind = 'virginica'
label_val = np.where(iris_names==kind)

# データフレームのコピーを取得
df_logi = df.copy()
# virginica列の追加 1:virginica, 0:その他
df_logi[kind] = df_logi['class'].apply(lambda x: 1 if x==label_val[0] else 0)
# 結果の表示
display(df_logi.head())

【実行結果】
virginica 列を追加しました。

■ データの準備
ヘルパー関数を定義しながら先に進めます。
ここでは、class(または virginica)の値の比率を一定に保って学習データとテストデータに分割する層化抽出の関数などを定義します。

### ★★変数のユニーク要素と個数を表示する関数の定義★★
def np_unique(x):
    value, counts = np.unique(x, return_counts=True)
    return pd.DataFrame({'値': value, '個数': counts}).set_index(['値'])


### ★★学習データとテストデータの分割関数の定義★★
def data_split(X, y, test_size=0.3, seed=123):

    # 学習データとテストデータに分割:層化抽出 stratify=y
    x_train, x_test, y_train, y_test = train_test_split(
        X, y, test_size=test_size, stratify=y, shuffle=True, random_state=seed)

    # 分割結果の表示
    print('x_train, x_test: ', x_train.shape, x_test.shape)
    print('y_train, y_test: ', y_train.shape, y_test.shape)
    print('\ny_train.value_counts:\n', np_unique(y_train))
    print('y_test.value_counts:\n', np_unique(y_test))
    print('\nX_train.head()')
    print(x_train[:5], '...')

    return x_train, x_test, y_train, y_test

では学習データとテストデータに分割します。

### 学習データとテストデータの分割

# 説明変数と目的変数の作成
X = df_logi.iloc[:, :4].values
y = df_logi[kind].values

# 学習データとテストデータに分割
x_train, x_test, y_train, y_test = data_split(X, y)

【実行結果】
学習データ 105 個、テストデータ 45 個(テストサイズ 30%)に分割しました。
学習データ、テストデータ共に、目的変数の値の比率が 2対1 になるように分割されました。

■ モデルの学習
ではモデルの学習を行います。
層化KFold交差検証の学習関数を定義して、5Foldで学習を実行します。

### ★★層化KFold交差検証による学習関数の定義★★

def StratifiedKFold_cv_train(clf, num_folds, seed=123):

    # 層化KFold交差検証による学習の実行
    result = cross_validate(
        estimator=clf,             # 分類器
        X=x_train,                 # 説明変数
        y=y_train,                 # 目的変数
        cv=StratifiedKFold(        # 交差検証手法~層化KFoldを指定
            n_splits=num_folds,    #  分割数
            shuffle=True,          #  シャッフル
            random_state=seed),    #  乱数シード
        scoring='accuracy',        # 評価指標
        return_estimator=True,     # 各Foldの分類器を取得
        return_train_score=True,   # 学習データのスコアを取得
        return_indices=True        # 各Foldのインデックスを取得
    )

    # 各Foldの分類器を取得
    models = result['estimator']

    # 結果の表示
    print('train accuracy: ', result['train_score'])
    print('valid accuracy: ', result['test_score'])

    return models, result

学習を実行します。
他のアルゴリズムとの違いは clf (分類器)の定義です!
ロジスティック回帰は次のように設定します。

clf = LogisticRegression()

### 層化KFold交差検証による学習の実行

# 設定と準備
num_folds = 5                  # fold数
clf = LogisticRegression()     # ロジスティック回帰分類器

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.964 ~ 0.988 です。
検証データの正解率は 0.905 ~ 1.000 です。

■ モデルの評価
二値分類用の予測・評価関数を定義して、予測を実行します。
学習時にFoldごとに作成された5つのモデルで予測し、確率値の平均を用いて予測します。

### ★★二値予測関数の定義★★

def predict_after_cv_binary(models, metrics, X, y_true=None, thres=0.5):

    # 予測値を格納するデータフレームの初期化
    df = pd.DataFrame()
    
    # 各Foldのmodelごとに予測値(確率値)算出とデータフレーム追加を繰り返し処理
    for i, model in enumerate(models):
        df[f'Fold{i}'] = model.predict_proba(X)[:, 1]
    
    # 予測値(確率値)の平均値をデータフレームに追加
    df['mean'] = df.mean(axis=1)
    
    # 確率値の平均値より閾値を用いて予測値(二値)を算出しデータフレームに追加
    df['pred'] = df['mean'].apply(lambda x: 1 if x>=thres else 0)
    
    # y_trueに正解値が設定されている場合の処理
    if y_true is not None:
        # 観測値(正解値)をデータフレームに追加
        df['true'] = y_true.astype(int)
        # 評価指標の値の算出と表示
        score = metrics(df['true'].values, df['pred'].values)
        print('score: ', score)
    
    return df

テストデータによる予測と評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_binary(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.978 。かなり高い正解率ではないでしょうか。

続いて、全データ(150個)の予測・評価を実行します。

### 全データの予測を実行
pred_df = predict_after_cv_binary(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.973 です。

全データの実績値と予測値を用いて、モデルを評価します。
混同行列作成関数を使って混同行列を算出し、scikit-learn の分類レポート機能を利用して、各種分類評価指標の値を眺めます。

### ★★混同行列の作成関数の定義★★

def make_conf_mtx(y_true, y_pred, class_names):
    ## 設定と準備
    # マルチカラム、マルチインデックスの設定
    columns = pd.MultiIndex.from_arrays([['pred']*len(class_names), class_names])
    index = pd.MultiIndex.from_arrays([['true']*len(class_names), class_names])

    ## 混同行列データフレームの作成
    conf_mtx = pd.DataFrame(confusion_matrix(y_true, y_pred),
                            index=index, columns=columns)
    return conf_mtx

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], ['other', kind]))

【実行結果】
誤分類は4個です。

分類レポートを表示します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
こんな感じです。分類=1(virginica)の適合率がやや低い感じです。

散布図で実績値・予測値を表現してみましょう。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1が正解値

# 描画領域の設定
plt.figure(figsize=(8, 7))
# 散布図の描画
sns.scatterplot(x=df_logi['petal length (cm)'], y=df_logi['petal width (cm)'],
                hue=pred_df['pred'], palette=['tab:blue', 'tab:red'],
                style=df_logi[kind], markers=['D', 'o'],
                size=df_logi[kind], sizes=[50, 80])
# 修飾
plt.grid(lw=0.5)
plt.show()

【実行結果】
petal length 5cm あたり、petal width 1.5cm あたりで誤分類が生じているようです。
データ点の重なりの影響で、全ての誤分類をぱっと見で確認できません。。。

決定木 p.190

続いて決定木で3つのクラスを分類する「多値分類」に取り組みます。

■ データの準備
3つのクラスが均等に割り当てられるように学習データとテストデータを分割します。
以降のアルゴリズムもこの分割データを利用します。

### 学習データとテストデータの分割

# 説明変数と目的変数の作成
X = df.iloc[:, :4].values
y = df['class'].values

# 学習データとテストデータに分割
x_train, x_test, y_train, y_test = data_split(X, y)

【実行結果】

■ モデルの学習
他のアルゴリズムとの違いは clf (分類器)の定義です!
決定木は次のように設定します。
決定木の引数 max_depth=3 を設定しています。

clf = DecisionTreeClassifier(max_depth=3, random_state=7)

### 層化KFold交差検証による学習

# 設定と準備
num_folds = 5                                               # fold数
clf = DecisionTreeClassifier(max_depth=3, random_state=7)   # 決定木分類器

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.976 程度です。
検証データの正解率は 0.905 ~ 1.000 です。

■ モデルの評価
多値分類用の予測・評価関数を定義して、予測を実行します。

### ★★多値分類予測関数の定義★★

def predict_after_cv_multi(models, metrics, X, y_true=None):

    # 予測値を格納するデータフレームの初期化
    df = pd.DataFrame()
    
    # 各Foldのmodelごとに予測値算出とデータフレーム追加を繰り返し処理
    for i, model in enumerate(models):
        df[f'Fold{i}'] = model.predict(X)
    
    # 予測値の最頻値をデータフレームに追加
    df['pred'] = df.mode(axis=1)[0]  # ★複数該当する時、便宜的に最初のクラスを採用
    
    # y_trueに正解値が設定されている場合の処理
    if y_true is not None:
        # 観測値(正解値)をデータフレームに追加
        df['true'] = y_true.astype(int)
        # 評価指標の値の算出と表示
        score = metrics(df['true'].values, df['pred'].values)
        print('score: ', score)
    
    return df

テストデータによる予測・評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_multi(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.956 です。

続いて全データによる予測・評価を行います。

### 全データの予測を実行
pred_df = predict_after_cv_multi(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.967 です。 

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], iris_names))

【実行結果】
誤分類は 5 個です。全て virsinica の予測誤りです。

分類レポートを作成します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
virginica の適合率が低いです。

多値分類の実績値と予測値の散布図を描画する関数を定義して、描画します。

### ★★分類の正解値と予測値の散布図の描画関数の定義★★

def plot_clf_result(pred_df):
    # 描画領域の設定
    plt.figure(figsize=(8, 7))
    # 散布図の描画
    sns.scatterplot(
        x=df['petal length (cm)'], y=df['petal width (cm)'],
        hue=pred_df['pred'], palette=['tab:blue', 'tab:red', 'tab:green'], 
        style=df['class'], markers=['D', 'o', 's'],
        size=df['class'], sizes=[50, 50, 50]
    )
    # 修飾
    plt.grid(lw=0.5)
    plt.show()

では描画します。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1, 緑の■型=2が分類成功

plot_clf_result(pred_df)

【実行結果】
versicolor と virsinica のキワで誤分類が起きやすいようです。

決定木は分類のロジックを可視化することができます。
学習データの分類のロジックを見てみましょう。

### 決定木のロジックの描画 ※models[0]を表示
plt.figure(figsize=(10, 8))
plot_tree(models[0], class_names=iris_names, feature_names=df.columns,
          filled=True);

【実行結果】
末端の右から2つ目の葉(四角形)の value を見ると、class 1(versicolor )とclass 2(virsinica)の混在が見られます。
petal length のみでの分類には限界があるようですね!

K近傍法 p.191

■ モデルの学習
他のアルゴリズムとの違いは clf (分類器)の定義です!
K近傍法は次のように設定します。
引数 n_neighbors(近傍点)を 3 に設定しました。

clf = KNeighborsClassifier(n_neighbors=3)

### 層化KFold交差検証による学習

# 設定と準備
num_folds = 5                               # fold数
clf = KNeighborsClassifier(n_neighbors=3)   # k近傍法分類器

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.964 ~ 0.988程度です。
検証データの正解率は 0.952 ~ 1.000 です。

■ モデルの評価
テストデータによる予測・評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_multi(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.956 です。

続いて全データによる予測・評価を行います。

### 全データの予測を実行
pred_df = predict_after_cv_multi(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.973 です。 

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], iris_names))

【実行結果】
誤分類は 4 個です。

分類レポートを作成します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
virginica の適合率と versicolor の再現率がやや低いです。

実績値と予測値の散布図を描画します。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1, 緑の■型が分類成功

plot_clf_result(pred_df)

【実行結果】
versicolor と virsinica のキワで誤分類が起きやすいようです。

サポートベクターマシン p.191

■ モデルの学習
他のアルゴリズムとの違いは clf (分類器)の定義です!
サポートベクターマシンは次のように設定します。
引数 C(正則化パラメータ)を 0.7 に設定しました。

clf = SVC(C=0.7)

### 層化KFold交差検証による学習

# 設定と準備
num_folds = 5        # fold数
clf = SVC(C=0.7)     # 決定木分類器

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.964 ~ 0.988程度です。
検証データの正解率は 0.952 ~ 1.000 です。

■ モデルの評価
テストデータによる予測・評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_multi(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.956 です。

続いて全データによる予測・評価を行います。

### 全データの予測を実行
pred_df = predict_after_cv_multi(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.973 です。 

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], iris_names))

【実行結果】
誤分類は 4 個です。ただしK近傍法とは異なる誤り方です。

分類レポートを作成します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
適合率と再現率の値は高めになりました。

実績値と予測値の散布図を描画します。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1, 緑の■型が分類成功

plot_clf_result(pred_df)

【実行結果】
versicolor と virsinica のキワで誤分類が起きやすいようです。

ニューラルネットワーク p.192

多層パーセプトロンで隠れ層2つのニューラルネットワークモデルを構築します。

■ モデルの学習
他のアルゴリズムとの違いは clf (分類器)の定義です!
多層パーセプトロンは次のように設定します。
引数でニューラルネットワークっぽさを表現しましたw

clf = MLPClassifier(
     hidden_layer_sizes=(128, 12), activation='relu', solver='adam',
     batch_size=5, learning_rate_init=0.0001, max_iter=1000,
     random_state=123)

### 層化KFold交差検証による学習

# 設定と準備
num_folds = 5         # fold数
clf = MLPClassifier(  # 多層パーセプトロン
    hidden_layer_sizes=(128, 12), activation='relu', solver='adam',
    batch_size=5, learning_rate_init=0.0001, max_iter=1000, random_state=123)

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.976 ~ 1.000 です。
検証データの正解率は 0.952 ~ 1.000 です。

■ モデルの評価
テストデータによる予測・評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_multi(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.956 です。

続いて全データによる予測・評価を行います。

### 全データの予測を実行
pred_df = predict_after_cv_multi(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.98 です。 

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], iris_names))

【実行結果】
誤分類は 3 個です。

分類レポートを作成します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
virsinica の適合率と versicolor の再現率の値は低めになりました。

実績値と予測値の散布図を描画します。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1, 緑の■型が分類成功

plot_clf_result(pred_df)

【実行結果】
versicolor と virsinica のキワで誤分類が起きやすいようです。

ナイーブベイズ p.194

■ モデルの学習
他のアルゴリズムとの違いは clf (分類器)の定義です!
ナイーブベイズは次のように設定します。

clf = GaussianNB()

### 層化KFold交差検証による学習

# 設定と準備
num_folds = 5        # fold数
clf = GaussianNB()   # ガウシアンナイーブベイズ 説明変数が連続値、正規分布に従う仮定

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.940 ~ 0.964 程度です。
検証データの正解率は 0.905 ~ 0.952 程度です。

■ モデルの評価
テストデータによる予測・評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_multi(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.978 です。

続いて全データによる予測・評価を行います。

### 全データの予測を実行
pred_df = predict_after_cv_multi(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.953 です。 

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], iris_names))

【実行結果】
誤分類は 7 個です。

分類レポートを作成します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
適合率と再現率の値は低めになりました。

実績値と予測値の散布図を描画します。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1, 緑の■型が分類成功

plot_clf_result(pred_df)

【実行結果】
versicolor と virsinica のキワで誤分類が起きやすいようです。

ランダムフォレスト(アンサンブル予測) p.196

■ モデルの学習
他のアルゴリズムとの違いは clf (分類器)の定義です!
ランダムフォレストは次のように設定します。
引数は、n_estimators(木の本数)=10000、max_depth(深さの最大値)=3、max_features(説明変数の最大数)=2 としました。

clf = RandomForestClassifier(
    n_estimators=10000, max_depth=3, max_features=2, random_state=123)

%%time
### 層化KFold交差検証による学習

# 設定と準備
num_folds = 5                                          # fold数
clf = RandomForestClassifier(                          # ランダムフォレスト分類器
    n_estimators=10000, max_depth=3, max_features=2, random_state=123)

# 学習の実行
models, result = StratifiedKFold_cv_train(clf, num_folds)

【実行結果】
学習データの正解率は 0.964 ~ 0.999 程度です。
検証データの正解率は 0.905 ~ 0.952 程度です。

■ モデルの評価
テストデータによる予測・評価を実行します。

### テストデータによる予測と評価
pred_df = predict_after_cv_multi(models, accuracy_score, x_test, y_test)
display(pred_df.head())

【実行結果】
正解率は 0.978 です。

続いて全データによる予測・評価を行います。

### 全データの予測を実行
pred_df = predict_after_cv_multi(models, accuracy_score, X, y)
display(pred_df)

【実行結果】
正解率は 0.98 です。 

混同行列を作成します。

### 混同行列の作成
display(make_conf_mtx(pred_df['true'], pred_df['pred'], iris_names))

【実行結果】
誤分類は 3 個です。

分類レポートを作成します。

### 分類評価レポートの表示
print(classification_report(pred_df['true'], pred_df['pred']))

【実行結果】
virginica の適合率と versicolor の再現率がやや低いです。

実績値と予測値の散布図を描画します。

### 分類の正解値と予測値の散布図の描画
# 青い◇形=0, 赤い◯型=1, 緑の■型が分類成功

plot_clf_result(pred_df)

【実行結果】
versicolor と virsinica のキワで誤分類が起きやすいようです。

【まとめ】
正解率で評価するとランダムフォレストが最も精度が高いと評価されます。

今回の写経は以上です。


シリーズの記事

次の記事

前の記事

目次

ブログの紹介


note で7つのシリーズ記事を書いています。
ぜひ覗いていってくださいね!

1.のんびり統計

統計検定2級の問題集を手がかりにして、確率・統計をざっくり掘り下げるブログです。
雑談感覚で大丈夫です。ぜひ覗いていってくださいね。
統計検定2級公式問題集CBT対応版に対応しています。
Python、EXCELのサンプルコードの配布もあります。

2.実験!たのしいベイズモデリング1&2をPyMC Ver.5で

書籍「たのしいベイズモデリング」・「たのしいベイズモデリング2」の心理学研究に用いられたベイズモデルを PyMC Ver.5で描いて分析します。
この書籍をはじめ、多くのベイズモデルは R言語+Stanで書かれています。
PyMCの可能性を探り出し、手軽にベイズモデリングを実践できるように努めます。
身近なテーマ、イメージしやすいテーマですので、ぜひぜひPyMCで動かして、一緒に楽しみましょう!

3.実験!岩波データサイエンス1のベイズモデリングをPyMC Ver.5で

書籍「実験!岩波データサイエンスvol.1」の4人のベイジアンによるベイズモデルを PyMC Ver.5で描いて分析します。
この書籍はベイズプログラミングのイロハをざっくりと学ぶことができる良書です。
楽しくPyMCモデルを動かして、ベイズと仲良しになれた気がします。
みなさんもぜひぜひPyMCで動かして、一緒に遊んで学びましょう!

4.楽しい写経 ベイズ・Python等

ベイズ、Python、その他の「書籍の写経活動」の成果をブログにします。
主にPythonへの翻訳に取り組んでいます。
写経に取り組むお仲間さんのサンプルコードになれば幸いです🍀

5.RとStanではじめる心理学のための時系列分析入門 を PythonとPyMC Ver.5 で

書籍「RとStanではじめる心理学のための時系列分析入門」の時系列分析をPythonとPyMC Ver.5 で実践します。
この書籍には時系列分析のテーマが盛りだくさん!
時系列分析の懐の深さを実感いたしました。
大好きなPythonで楽しく時系列分析を学びます。

6.データサイエンスっぽいことを綴る

統計、データ分析、AI、機械学習、Pythonのコラムを不定期に綴っています。
統計・データサイエンス書籍にまつわる記事が多いです。
「統計」「Python」「数学とPython」「R」のシリーズが生まれています。

7.Python機械学習プログラミング実践記

書籍「Python機械学習プログラミング PyTorch & scikit-learn編」を学んだときのさまざまな思いを記事にしました。
この書籍は、scikit-learnとPyTorchの教科書です。
よかったらぜひ、お試しくださいませ。

最後までお読みいただきまして、ありがとうございました。

いいなと思ったら応援しよう!

ネイピア DS 応援ありがとうございます。これからもがんばって記事を作成します!