機械学習の基礎 09 - 分類アルゴリズムの確認 (インドの糖尿病ピマ インディアン データセットに基づく)

アルゴリズムのレビューは、適切な機械学習アルゴリズムを選択する主な方法の 1 つです。アルゴリズムを検討するまでは、どのアルゴリズムが問題に対して最も効果的であるかは不明
であり、問​​題に対して最も効果的なアルゴリズムを見つけるには、検証のために特定の実験を設計する必要があります。
この章では、scikit-learn を通じて 6 つの機械学習分類アルゴリズムを確認し、アルゴリズム評価行列の結果を比較し、適切なアルゴリズムを選択する方法を学習します。

機械学習の分類アルゴリズムを確認するにはどうすればよいですか?

アルゴリズムをレビューする前に、どのアルゴリズムがデータセットに対して最も効果的で、最適なモデルを生成できるかを判断する方法はなく、
一連の実験を通じて問題に対してどのアルゴリズムが最も効果的であるかを判断する必要があります。さらにアルゴリズムを選択します。このプロセスはアルゴリズムレビューと呼ばれます。

アルゴリズムを選択するときは、データにどのアルゴリズムを使用するかではなく、データを使用してどのアルゴリズムをレビューするかという考え方を変える必要があります。どのアルゴリズムが最良の結果をもたらすかを最初に推測する必要があります。これは、データに対する感受性を訓練するのに最適な方法です。同じデータセットに対して異なるアルゴリズムを使用してアルゴリズムの有効性を確認し、最も効果的なアルゴリズムを見つけることを強くお勧めします。
アルゴリズムをレビューするためのいくつかの提案を次に示します。

  • さまざまな代表的なアルゴリズムを試してください。
  • さまざまな機械学習アルゴリズムを試してみましょう。
  • 複数のモデルを試してください。

次に、いくつかの一般的な分類アルゴリズムを紹介します。

分類アルゴリズムには、現在、線形分類器、ベイジアン分類器、距離ベースの分類器など、多くの種類の分類器があります。次に、6 つの分類アルゴリズムが紹介され、最初に 2 つの線形アルゴリズムが紹介されます。

  • ロジスティック回帰。
  • 線形判別分析。

さらに 4 つの非線形アルゴリズムを紹介します。

  • K の最も近い隣人。
  • ベイズ分類器。
  • 分類および回帰ツリー。
  • サポートベクターマシン。

次に、引き続きピマ インディアン データセットを使用してアルゴリズムをレビューし、10 分割相互検証を使用してアルゴリズムの精度を評価します。平均精度を使用してアルゴリズムのスコアを標準化し、アルゴリズムに対するデータ分散の不均衡の影響を軽減します。

ロジスティック回帰と線形判別分析はどちらも、入力データがガウス分布に従うことを前提としています。

ロジスティック回帰


回帰はy=f(x)に相当し、独立変数xと従属変数yの関係を示すわかりやすいモデルです。医者が病気の治療の際に、まず見て、嗅いで、聞いて、切ることで、その患者が病気なのか、何の病気なのかを判断するのと同じように、ここでの「見て、嗅いで、聞いて、切る」とは独立変数を求めることです。特徴データであるxを用いて患者が病気かどうかを判断することは、従属変数yを求めること、つまり分類を予測することに相当します。

ロジスティック回帰は、実際には回帰アルゴリズムではなく分類アルゴリズムであり、通常、既知の独立変数を使用して、離散従属変数の値 (バイナリ値 0/1、はい/いいえ、真/偽など) を予測します。簡単に言えば、ロジット関数を当てはめることによってイベントの確率を予測します。したがって、確率値を予測し、その出力値は 0 から 1 になるはずなので、二項分類問題を扱うのに非常に適しています。scikit-learn の実装クラスは LogisticRegression です。コードは以下のように表示されます:

データセットのダウンロード

import pandas as pd

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import KFold, cross_val_score

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)

#打印标签名称
print(data.columns)

#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7

#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
model = LogisticRegression()

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))



操作結果:

算法评估结果:0.776 (0.045)

線形判別分析


線形判別分析 (LDA) は、フィッシャー線形判別 ( FLD) とも呼ばれ、パターン認識の古典的なアルゴリズムであり、1996 年に Belhumeur によってパターン認識と人工知能の分野に導入されました

線形判別分析の基本的な考え方は、高次元のパターン サンプルを最適な判別ベクトル空間に射影して、分類情報の抽​​出と特徴空間の次元の圧縮の効果を実現することです。射影後のパターン サンプルは、最大の値を持つことが保証されます。新しい部分空間距離のクラス ギャップとクラス内の最小距離。つまり、パターンはその空間内で最高の分離性を持っています。

したがって、有効な特徴抽出方法である。この方法を使用すると、投影されたパターン サンプルのクラス間散乱行列を最大化し、クラス内散乱行列を最小化できます。つまり、投影後のパターン サンプルが新しい空間で最小のクラス内距離と最大のクラス間距離を持つこと、つまり、パターンがこの空間で最高の分離性を持つことを保証できます。線形判別分析は、主成分分析と同様に、データの次元削減に広く使用されています

scikit-learn の実装クラスは LinearDiscriminantAnalysis です。コードは以下のように表示されます:

import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn.model_selection import KFold, cross_val_score

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)

#打印标签名称
print(data.columns)

#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7

#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
model = LinearDiscriminantAnalysis()

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))



操作結果:

Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],
      dtype='object')
算法评估结果:0.767 (0.048)

非線形アルゴリズム

以下に、K 最近傍 (KNN)、ベイジアン分類器、分類および回帰ツリー、サポート ベクター マシン アルゴリズムの 4 つの非線形アルゴリズムを紹介します。

K 最近傍アルゴリズム

K 最近傍アルゴリズムは理論的には比較的成熟した手法であり、最も単純な機械学習アルゴリズムの 1 つでもあります。

KNN では、オブジェクト間の距離は
オブジェクト間の非類似性インデックスとして計算され、オブジェクト間の一致の問題が回避されます。距離には通常、ユークリッド距離またはマンハッタン距離が使用されます。決定は、単一のオブジェクト クラスではなく、最適なクラスに基づいて行われます。 。これが KNN アルゴリズムの利点です。scikit-learn の実装クラスは KNeighborsClassifier です。コードは以下のように表示されます。

import pandas as pd
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

from sklearn.model_selection import KFold, cross_val_score
from sklearn.neighbors import KNeighborsClassifier

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)



#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7

#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
model = KNeighborsClassifier()

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))



操作結果:


算法评估结果:0.711 (0.051)

ベイズ分類器

ベイジアン分類器の分類原理は、オブジェクトの事前確率を使用して、ベイズの公式を使用してすべてのカテゴリにおける事後確率、つまりオブジェクトが特定のカテゴリに属する​​確率を計算し、そのオブジェクトを選択することです。オブジェクトが属するクラスとしての最大事後確率クラス。つまり、ベイジアン分類器は、最小エラー率という意味で最適化されています。

各カテゴリの発生確率のうち最も大きい値が、分類されるアイテムがどのカテゴリに属する​​かが考慮されます。ベイジアン分類器は次のように特徴付けられます。

  • ベイジアン分類器は、特定のクラスに属する確率に従って特定のサンプルを分類する、統計に基づいた分類器です。
  • ベイズ分類器の理論的基礎はベイズ理論です。
  • ベイジアン分類器の単純な形式はナイーブ ベイジアン分類器であり、ランダム フォレストやニューラル ネットワークなどの分類器と同等のパフォーマンスを備えています。
  • ベイジアン分類器は増分分類器です。

ベイジアン分類器では、入力データもガウス分布に準拠すると想定されます。scikit-learnの実装クラスは
GaussianNB です。
コードは以下のように表示されます。

import pandas as pd

from sklearn.model_selection import KFold, cross_val_score
from sklearn.naive_bayes import GaussianNB


#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7

#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#高斯朴素贝叶斯
model = GaussianNB()

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))



操作結果:

算法评估结果:0.759 (0.039)

分類木と回帰木

分類と回帰ツリーの英語の略語は CART で、これも決定木の一種に属し、ツリーの構築はジニ指数に基づいています。

CART は、デシジョン ツリーがバイナリ ツリーであり、内部ノードの特徴の値が「yes」と「no」であることを前提としています。左の分岐は値が「yes」の分岐で、右の分岐は値が「yes」の分岐です。値は「いいえ」です。このような決定木は、各特徴を再帰的に二等分し、入力空間 (特徴空間) を有限数のユニットに分割し、これらのユニット上の予測確率分布、つまり、与えられた入力のもとでの出力の条件付き確率を決定することと同等です。条件配布。

CART アルゴリズムは次の 2 つのステップで構成されます。

  • ツリーの生成: トレーニング データ セットに基づいてデシジョン ツリーを生成します。生成されるデシジョン ツリーはできるだけ大きくなければなりません。
  • ツリー枝刈り:生成されたツリーを検証用データセットを用いて枝刈りし、最適なサブツリーを選択しますが、このとき枝刈りの基準として最小損失関数が使用されます。

決定木の生成は、二分決定木を再帰的に構築するプロセスであり、回帰木には二乗誤差最小化基準を使用するか、分類木にはジニ指数最小化基準を使用して、特徴選択を実行して二分木を生成します。CART モデルは、scikit-learn の DecisionTreeClassifier クラスを通じて構築できます。コードは以下のように表示されます:

import pandas as pd

from sklearn.model_selection import KFold, cross_val_score
from sklearn.naive_bayes import GaussianNB
from sklearn.tree import DecisionTreeClassifier

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7

#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#高斯朴素贝叶斯
model = DecisionTreeClassifier()

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))



操作結果:

算法评估结果:0.695 (0.051)

サポートベクターマシン

サポート ベクター マシンは、1995 年に Corinna Cortes と Vapnik によって初めて提案されました。サポート ベクター マシンは、小さなサンプル、非線形および高次元のパターン認識を解決する際に多くの独自の利点を示し、関数フィッティングなどの他の機械学習問題にも拡張できます。

機械学習におけるサポート ベクター マシン (SVM) は、データを分析し、分類と回帰分析のためのパターンを認識できる、関連する学習アルゴリズムに関連する教師あり学習モデルです。トレーニング サンプルのセットが与えられると、各レコードはそのカテゴリでラベル付けされ、サポート ベクター マシン アルゴリズムを使用してトレーニングされ、新しいデータ インスタンスを分類するモデルが構築され、非確率的なバイナリ線形分類になります。

SVM モデルの例としては、異なるクラスに属するインスタンスが、鋭いギャップを持ち、可能な限り広いパーティションで表されるように、空間内の異なる点をマッピングすることが挙げられます。新しいインスタンスは同じ空間にマッピングされ、同じギャップに該当するという事実に基づいて同じカテゴリに属する​​と予測されます。現在、SVM は複数分類の問題に対処できるように拡張されており、scikit-learn の SVC クラスを通じて SVM モデルを構築できるようになりました。

コードは以下のように表示されます:

import pandas as pd

from sklearn.model_selection import KFold, cross_val_score
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)


#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]

Y = array[:, 8]

num_folds = 10
seed = 7

#特征选择
kfold = KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#高斯朴素贝叶斯
model = SVC()

result = cross_val_score(model, X, Y, cv=kfold)

print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))



算法评估结果:0.760 (0.035)

6 つの分類アルゴリズムと、scikit-learn での実装を紹介します。アルゴリズムは主に
、線形アルゴリズム、距離アルゴリズム、ツリー アルゴリズム、統計アルゴリズムなどに分類されます。各アルゴリズムには適用可能なシナリオが異なり、データ セットの要件も異なります。

今回は、適切なアルゴリズム モデルを選択する効果的な方法である、ピマ インディアン データセットを使用していくつかのアルゴリズムをレビューします。

6 つのアルゴリズム評価テーブルは次のとおりです。

アルゴリズム名 アルゴリズムの評価結果
ロジスティック回帰 LogisticRegression アルゴリズム評価結果: 0.776 (0.045)
線形判別分析 LinearDiscriminantAnalysis アルゴリズム評価結果: 0.767 (0.048)
K 最近傍アルゴリズム KNeighborsClassifier アルゴリズム評価結果:0.711(0.051)
ベイジアン分類器 GaussianNB アルゴリズム評価結果: 0.759 (0.039)
分類および回帰ツリー DecisionTreeClassifier アルゴリズム評価結果:0.695(0.051)
サポート ベクター マシン SVC() アルゴリズム評価結果: 0.760 (0.035)

おすすめ

転載: blog.csdn.net/hai411741962/article/details/132478062