ポイント: このチュートリアルは、健康指標を使用して糖尿病を予測する分類タスクのためにscikit-learnを使用する方法を示しています。データ準備、サポートベクターマシンによるモデルのトレーニング、混同行列などのメトリクスによる評価をカバーしています。
- 糖尿病患者と非糖尿病患者の健康データ(グルコースやBMIなど)を利用しています。
- モデルのトレーニングにはscikit-learnのSVCを使用し、精度の評価には混同行列を使用しています。
ここでは、scikit-learnの使用方法を示します。この例のコードはこちらです。Kaggleからデータをダウンロードするにはこちらをクリックしてください。
どの機械学習フレームワークを使用すべきか?
scikit-learnがどのように機能するかを示す前に、どのMLフレームワークを使用するかについて考える価値があります。多くの人がデータサイエンスを始める際にTensorFlowから始める必要があると思っていますが、それはほとんどの問題に対して過剰です。TensorFlowが特化している低レベルのアプローチは、あまりにも複雑です。もっと簡単なアプローチが存在します。
データ
| scikit-learn | TensorFlow | Keras | Spark ML |
|
この汎用MLフレームワークは、使いやすく、ほとんどのML問題に対応できます。 データサイエンティストの間で非常に人気があります。他のフレームワークを使用しているデータサイエンティストでも、コードの一部でscikit-learnユーティリティをデプロイすることがよくあります。 |
TensorFlowは1つの目的のために設計されています:ニューラルネットワークです。非常に低レベルであるため、NumPy配列やニューラルネットワーク理論について多くの知識が必要です。 Googleは、TPUと呼ばれる特別なCPUを販売しており、これは非常に大規模なスケールでテンソルを処理するように設計されています。したがって、顔認識のような計算集約的なタスクのために設計されていますが、ほとんどのビジネス問題は顔認識よりも複雑ではありません。 TensorFlowとKerasを使用したMLのチュートリアルをこちらで作成しました。 |
TensorFlowを使用したい場合は、Kerasを使用してください。Kerasはフロントエンドとして機能し、はるかに簡単になります。誤った答えを生じるミスをする可能性が低くなります。 Kerasは他の人気のあるMLフレームワークの前でも機能し、それらも簡単に使用できます。
|
scikit-learnは1台のサーバーで実行するように設計されています。大量のデータがある場合は、Spark MLを使用することをお勧めします。Spark MLはクラスター全体で実行するように設計されています。 また、Spark MLは理解しやすいです。 |
すべてのPython MLフレームワークは、ほぼ同じように始まります。以下の同じツールから始まります:
- Pandas. これはcsv、json、Spark、その他のデータタイプを行と列に整理します。Pandasはすべての種類のデータを大幅に簡素化しますが、その高度な機能は複雑になる可能性があります。
- NumPy. これはPandasとmatplotlibの両方に密接に関連しています。NumPyは、最も重要な機械学習タスクである、複数の次元における行列の乗算という計算負荷の高い操作を扱う際に最も効果を発揮します。これらが増えると、コンピュータのメモリをすぐに使い果たすことがあります。
- Matplotlib. これはヒストグラム、折れ線グラフなどのチャートを描画します。データを探索する良い方法としてデータを視覚化し、プログラムの最後に結果を示すことができます。
- Seaborn. このフレームワークはmatplotlibの上に構築されており、データサイエンス専用に設計されています。
私たちが見ているデータは、糖分、体重指数などで、糖尿病の人とそうでない人の2セットから取得されています。その分類1(糖尿病)と0(非糖尿病)はOutcome 列にあります。このデータを使用して、特定の健康指標に基づいて、ある人が糖尿病にかかる可能性があるかどうかを示す予測モデルを訓練するのが目標です。
アルゴリズム
分類問題にアプローチする方法はたくさんあります。例えば、ロジスティック回帰やニューラルネットワークなどです。ここではサポートベクターマシン(SVM)を使用します。
最初のステップは、データをデータフレームに読み込むことです。
import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
data = pd.read_csv('/home/ubuntu/Downloads/diabetes.csv', delimiter=',')
その後、それを見てみましょう。
data.head()
機械学習では、データを特徴 とラベルに分割する必要があります。
- 特徴は、見ているものの特性であり、独立変数とも呼ばれます。
- ラベルは、予測しようとしているものであり、従属変数とも呼ばれます。
分類とは、有限の結果のセットがあることを意味します。ここでは2つあるので、これをバイナリ分類問題と呼ぶことができます。
ご覧の通り、outcome、つまり糖尿病のある人とない人は最後の列です。したがって、残りは特徴です。このデータを分割するのは簡単です。ラベルが最後にあるからです。
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI \
0 6 148 72 35 0 33.6
1 1 85 66 29 0 26.6
2 8 183 64 0 0 23.3
3 1 89 66 23 94 28.1
4 0 137 40 35 168 43.1
DiabetesPedigreeFunction Age Outcome
0 0.627 50 1
1 0.351 31 0
2 0.672 32 1
3 0.167 21 0
4 2.288 33 1
Pandasのdrop()コマンドは、既存のデータフレームから1つ以上の列を削除して新しいデータフレームを作成することを意味します。axis=1は、列を指しており、行(Pandasではインデックスとして知られています)ではないことを意味します。
x = data.drop("Outcome", axis=1)
data['Outcome']はPandasのSeries であり、Pandasデータフレームではありません。これは1つの列しかありませんが、インデックス列はまだあります。np.ravel()はそれを配列にフラット化します。
y=np.ravel(data['Outcome'])
標準的な手順は、入力データを取り、いくつかの量で分割することによってトレーニングデータセットとテストデータセットを作成することです。ここでは50%を選択します。
- トレーニングデータセットはモデルをトレーニングするために使用されます。
- テストデータセットはそのトレーニングされたモデルに基づいて予測を行うために使用されます。
xとyを使用するのは、線のための親しみのある方程式y = mx + bのためです。機械学習ではyはベクトルであり、mとxは行列、つまりn次元ベクトルを意味します。bはバイアスで、単一の実数です。
x_train, x_test, y_train, y_test = train_test_split(x,y, test_size = 0.5, random_state=50)
データを正規化します。基本的には、値を計算します(( x - μ) / δ )、ここでμは平均で、δは標準偏差です。これにより、すべての特徴を同じスケールに揃えます。これは通常の機械学習の実践です。言い換えれば、大きな数を小さくし、すべての数がほぼ同じサイズになるようにします。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler().fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
まずモデルを宣言します。サポートベクターマシンを使用しています。
from sklearn.svm import SVC
svc_model = SVC()
次に、それをトレーニングします。scikit-learnを使用する際にはそれだけで簡単です。他のデータ操作は必要ありません。
svc_model.fit(x_train, y_train)
fit()関数はこの情報を返します。
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,
decision_function_shape='ovr', degree=3, gamma='auto_deprecated',
kernel='rbf', max_iter=-1, probability=False, random_state=None,
shrinking=True, tol=0.001, verbose=False)
次に、テストデータを使用して予測を作成します。
y_predict = svc_model.predict(x_test)
その後、モデルが正しいかどうかを視覚的に示す混同行列を作成します。これは、モデルが正しい回数と間違った回数を確認する視覚的な方法です。
from sklearn.metrics import classification_report, confusion_matrix
cm = np.array(confusion_matrix(y_test, y_predict, labels=[0,1]))
confusion = pd.DataFrame(cm, index=['Diabetic', 'Not Diabetic'], columns=['Predicted Diabetes', 'Predicted Healthy'])
Predicted Diabetes Predicted Healthy
Diabetic 225 23
Not Diabetic 68 68
その表示は最初は少し理解しにくいので、次のように考えてみてください:
Diabetic (Outcome = 1) True positive. Patient is diabetic and model correctly predicted that. False positive. Patient was not diabetic but model said patient was diabetic.
Not Diabetic (Outcome = 0) False positive. Patient was not diabetic, but model said patient was diabetic.
True negative, patient not diabetic and model predicted that.
Matplotlibの強力なSeaborn拡張を使用して同じ結果を示すグラフィカルな方法です:
sns.heatmap(confusion,annot=True,fmt='g')
分類レポートはモデルの要約を印刷し、77%の精度を示します。これは、私たちのモデルが糖尿病を77%の確率で正確に予測することを意味します。
print(classification_report(y_test, y_predict))
precision recall f1-score support
0 0.77 0.91 0.83 248
1 0.75 0.50 0.60 136
micro avg 0.76 0.76 0.76 384
macro avg 0.76 0.70 0.72 384
weighted avg 0.76 0.76 0.75 384
結果は、Kerasをニューラルネットワークとして使用したときとほぼ同じでした。
scikit Learnガイド
これらの投稿は私自身のものであり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。