5つのステップでScikit-learnを始める
5 Steps to Getting Started with Scikit-learn
Scikit-learnの紹介
Scikit-learnの使用方法を学ぶ際には、機械学習の基本的な概念を理解している必要があります。Scikit-learnは、機械学習の原則と関連するタスクを実装するための実用的なツールに過ぎません。機械学習は、明示的にプログラムされることなく、経験から学習し改善するための人工知能の一部です。アルゴリズムはトレーニングデータを使用してパターンや洞察を見つけ、予測や意思決定を行います。機械学習には3つの主要なタイプがあります:
- 教師あり学習 – モデルはラベル付きデータでトレーニングされ、入力と出力をマッピングすることを学びます
- 教師なし学習 – モデルはラベルのないデータ内の隠れたパターンやグループを見つけるために作業します
- 強化学習 – モデルは環境と相互作用し、報酬と罰を受け取って最適な行動を促進することで学習します
ご存知のように、機械学習は現代社会の多くの側面を支えており、膨大な量のデータを生成しています。データの利用可能性が増すにつれて、機械学習の重要性も増しています。
- 「人物再識別入門」
- 「今日、何を見たと思う?このAIモデルは、あなたの脳の信号を解読して、あなたが見たものを再構築するんだよ」
- 『DiffBIRを紹介:事前学習済みのテキストから画像への拡散モデルを使用して、盲目的な画像修復問題に対処するAIアプローチ』
Scikit-learnは、人気のあるオープンソースのPythonライブラリです。広く使用されている理由のいくつかは次のとおりです:
- データ分析とモデリングのためのシンプルで効率的なツール
- Pythonプログラマーにアクセスしやすく、明確さに重点を置いています
- NumPy、SciPy、matplotlib上に構築されており、統合が容易です
- 分類、回帰、クラスタリング、次元削減などのタスクに対する幅広いアルゴリズム
このチュートリアルでは、Scikit-learnの使用方法(主に一般的な教師あり学習タスク)について、包括的なハンズオンの例に焦点を当てながら、ステップバイステップで説明します。
ステップ1:Scikit-learnの始め方
インストールとセットアップ
Scikit-learnをインストールして使用するには、システムに正常に動作するPythonのインストールが必要です。ここではそれについて説明しませんが、この時点で正常にインストールされていると想定します。
Scikit-learnは、Pythonのパッケージマネージャであるpipを使用してインストールすることができます:
pip install scikit-learn
これにより、NumPyやSciPyなどの必要な依存関係もインストールされます。インストールした後、Scikit-learnは次のようにPythonスクリプトでインポートできます:
import sklearn
インストールのテスト
インストールが完了したら、Pythonインタプリタを起動して上記のインポートコマンドを実行することができます。
Python 3.10.11 (main, May 2 2023, 00:28:57) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sklearn
エラーメッセージが表示されない限り、Scikit-learnを使用する準備が整いました!
サンプルデータのロード
Scikit-learnには、テストや実験に使用できるさまざまなサンプルデータセットが用意されています:
from sklearn import datasets
iris = datasets.load_iris()
digits = datasets.load_digits()
digitsデータセットには、手書きの数字の画像とそのラベルが含まれています。実際のデータに進む前に、これらのサンプルデータセットを使用してScikit-learnに慣れていきましょう。
ステップ2:データの前処理
データの前処理の重要性
実世界のデータはしばしば不完全で一貫性がなく、エラーを含んでいます。データの前処理は、機械学習に使用するための生データを使いやすい形式に変換する作業であり、ダウンストリームのモデルの性能に影響を与える重要なステップです。
多くの初心者の実践者は、適切なデータの前処理を見落とし、モデルのトレーニングに直ちに取り掛かることがあります。しかし、低品質のデータ入力は、使用されるアルゴリズムの洗練さに関係なく、低品質のモデル出力につながります。欠損データの適切な処理、外れ値の検出と削除、特徴エンコーディング、特徴スケーリングなどの手順は、モデルの精度向上に役立ちます。
データの前処理は、機械学習プロジェクトにおいて時間と労力の大部分を占めます。古いコンピュータサイエンスの格言「ゴミを入れればゴミが出る」は、ここでも非常に適用されます。高品質なデータ入力は、高性能な機械学習の前提条件です。データの前処理手順は、生データを洗練されたトレーニングセットに変換し、機械学習アルゴリズムが予測パターンと洞察を効果的に発見できるようにします。
要するに、データを適切に前処理することは、機械学習ワークフローにおいて不可欠なステップであり、十分な注力と綿密な取り組みが必要です。
データの読み込みと理解
デモンストレーション用に、Scikit-learnを使用してサンプルデータセットを読み込みましょう:
from sklearn.datasets import load_iris
iris_data = load_iris()
特徴量とターゲット値を探索することができます:
print(iris_data.data[0]) # 最初のサンプルの特徴量
print(iris_data.target[0]) # 最初のサンプルのターゲット値
進む前に、特徴量とターゲットの意味を理解する必要があります。
データのクリーニング
実際のデータには、欠損、破損、外れ値が含まれることがよくあります。Scikit-learnはこれらの問題を処理するためのツールを提供しています:
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')
imputed_data = imputer.fit_transform(iris_data.data)
インピュータは、欠損値を平均値で置き換えます。これは一般的な戦略ですが、唯一の戦略ではありません。これはデータのクリーニングのためのアプローチの一つです。
特徴量のスケーリング
サポートベクターマシン(SVM)やニューラルネットワークなどのアルゴリズムは、入力特徴量のスケールに敏感です。一貫性のない特徴量のスケールは、これらのアルゴリズムが大きなスケールを持つ特徴量に過剰な重要性を付けることになり、モデルのパフォーマンスに影響を与えます。そのため、これらのアルゴリズムをトレーニングする前に、特徴量を同様のスケールに正規化または標準化することが重要です。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_data = scaler.fit_transform(iris_data.data)
StandardScalerは、特徴量を平均0、分散1に標準化します。他のスケーラも利用できます。
データの可視化
Matplotlibを使用してデータを可視化することもできます。これにより、さらなる洞察を得ることができます:
import matplotlib.pyplot as plt
plt.scatter(iris_data.data[:, 0], iris_data.data[:, 1], c=iris_data.target)
plt.xlabel('がく片の長さ')
plt.ylabel('がく片の幅')
plt.show()
データの可視化は、機械学習ワークフローにおいて複数の重要な機能を果たします。データの潜在的なパターンやトレンドを見つけることができ、モデルのパフォーマンスに影響を与える可能性のある外れ値を特定することができ、変数間の関係をより深く理解することができます。データを事前に可視化することで、特徴量の選択やモデルのトレーニングフェーズでより情報を持った意思決定ができます。
ステップ3:モデルの選択とトレーニング
Scikit-learnアルゴリズムの概要
Scikit-learnは、さまざまな教師ありおよび教師なしアルゴリズムを提供しています:
- 分類:ロジスティック回帰、SVM、ナイーブベイズ、決定木、ランダムフォレスト
- 回帰:線形回帰、SVR、決定木、ランダムフォレスト
- クラスタリング:k-Means、DBSCAN、階層クラスタリング
他にも多数あります。
アルゴリズムの選択
最適な機械学習アルゴリズムを選択することは、高品質なモデルの構築にとって非常に重要です。最適なアルゴリズムは、いくつかの重要な要素に依存します:
- トレーニングに使用可能なデータのサイズとタイプ。データセットは小さいですか、大きいですか?どのような特徴量が含まれていますか – 画像、テキスト、数値など?
- 使用可能な計算リソース。アルゴリズムは計算の複雑さが異なります。単純な線形モデルは、深層ニューラルネットワークよりも高速にトレーニングされます。
- 解決したい具体的な問題。分類、回帰、クラスタリング、またはより複雑な問題ですか?
- 解釈性の必要性などの特別な要件。線形モデルはブラックボックスの手法よりも解釈しやすいです。
- 望ましい精度/パフォーマンス。一部のアルゴリズムは、特定のタスクで他のアルゴリズムよりも優れたパフォーマンスを発揮します。
特定のサンプル問題であるアヤメの花の分類には、ロジスティック回帰やサポートベクターマシンなどの分類アルゴリズムが最も適しています。これらは提供された特徴量の測定に基づいて花を効率的に分類することができます。他のより単純なアルゴリズムでは十分な正確さを提供することができないかもしれません。一方で、ディープニューラルネットワークのような非常に複雑な手法は、比較的単純なデータセットに対してはオーバーキルになるでしょう。
今後モデルを訓練する際には、上記で述べたような考慮事項に基づいて、常に特定の問題に最も適したアルゴリズムを選択することが重要です。適切なアルゴリズムを選択することで、高品質な機械学習システムの開発が保証されます。
シンプルなモデルの訓練
ロジスティック回帰モデルを訓練しましょう:
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(scaled_data, iris_data.target)
以上です!モデルの訓練が完了し、評価と使用の準備ができました。
より複雑なモデルの訓練
ロジスティック回帰のようなシンプルな線形モデルは、しばしばまずまずのパフォーマンスを提供することができますが、より複雑なデータセットでは、より洗練されたアルゴリズムを活用する必要があるかもしれません。例えば、アンサンブル法は複数のモデルを組み合わせ、バギングやブースティングといったテクニックを用いて、全体の予測精度を向上させます。具体的には、多数の決定木を集約するランダムフォレスト分類器を訓練することができます:
from sklearn.ensemble import RandomForestClassifier
rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(scaled_data, iris_data.target)
ランダムフォレストは非線形な関係や特徴間の複雑な相互作用を捉えることができるため、単一の決定木よりもより正確な予測を行うことができます。また、SVMや勾配ブースティング木、ニューラルネットワークなどのアルゴリズムを使用することで、難しいデータセットでさらなるパフォーマンスの向上が可能です。重要なのは、単純な線形モデルを超えた異なるアルゴリズムを試して、それぞれの強みを活かすことです。
ただし、モデルの訓練にシンプルなアルゴリズムまたはより複雑なアルゴリズムを使用するかにかかわらず、Scikit-learnの構文では同じアプローチが可能であり、学習曲線を劇的に短縮することができます。実際、ライブラリを使用したほとんどのタスクは、fit/transform/predictのパラダイムで表現することができます。
ステップ4:モデルの評価
評価の重要性
機械学習モデルのパフォーマンスを評価することは、最終的な本番展開の前に絶対に必要なステップです。モデルの包括的な評価は、システムが展開後に信頼性を持って動作することを保証するために不可欠です。さらに、モデルの予測精度と汎化能力を向上させるために改善が必要な箇所を特定することもできます。モデルは訓練データ上で非常に正確に見えるかもしれませんが、実世界のデータ上では惨憺たる結果を示すこともあります。これは、訓練データだけでなく、ホールドアウトされたテストセットや新しいデータ上でモデルをテストすることの重要性を強調しています。
モデルの展開時の性能をシミュレートする必要があります。モデルの包括的な評価により、訓練データのパターンを記憶するが、サンプル外の予測に役立つ一般化関係を学習しないオーバーフィッティングの可能性も明らかになります。オーバーフィッティングの検出により、正則化やクロスバリデーションなどの適切な対策を講じることができます。評価により、複数の候補モデルを比較して最も性能が良いオプションを選択することも可能です。単純なベンチマークモデルに比べて十分な改善を提供しないモデルは、再設計したり完全に置き換えたりする必要があります。
要約すると、機械学習モデルの包括的な評価は、信頼性を確保し、価値を追加するために不可欠です。これは単なるオプションの分析演習ではなく、真に効果的なシステムを展開するためのモデル開発ワークフローの一部です。そのため、機械学習の実践者は、展開を考える前に、関連するパフォーマンス指標に沿ってモデルを適切に評価するために十分な努力を傾けるべきです。
トレーニング/テスト分割
データを分割して新しいデータでモデルのパフォーマンスを評価します:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(scaled_data, iris_data.target)
慣例として、Xは特徴量を、yは目的変数を指します。なお、y_test
とiris_data.target
は同じデータを指す異なる方法です。
評価指標
分類のための主な指標には、以下があります:
- 正確度:正しい予測の全体的な割合
- 適合率:実際の陽性の中で陽性と予測された割合
- 再現率:実際の陽性を陽性と予測された割合
これらはScikit-learnの分類レポートを使用して計算できます:
from sklearn.metrics import classification_report
print(classification_report(y_test, model.predict(X_test)))
これにより、モデルの性能について洞察が得られます。
ステップ5:性能の向上
ハイパーパラメータの調整
ハイパーパラメータはモデルの設定です。調整することで性能を向上させることができます:
from sklearn.model_selection import GridSearchCV
params = {'C': [0.1, 1, 10]}
grid_search = GridSearchCV(model, params, cv=5)
grid_search.fit(scaled_data, iris_data.target)
これにより、異なる正則化強度でグリッドを作成し、モデルの正確度を最適化します。
交差検証
交差検証はハイパーパラメータのより信頼性の高い評価を提供します:
from sklearn.model_selection import cross_val_score
cross_val_scores = cross_val_score(model, scaled_data, iris_data.target, cv=5)
これにより、データが5つのフォールドに分割され、各フォールドでの性能が評価されます。
アンサンブル手法
複数のモデルを組み合わせることで性能を向上させることができます。これを示すために、まずランダムフォレストモデルをトレーニングしましょう:
from sklearn.ensemble import RandomForestClassifier
random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(scaled_data, iris_data.target)
これで、ロジスティック回帰モデルとランダムフォレストモデルの両方を使用してアンサンブルモデルを作成できます:
from sklearn.ensemble import VotingClassifier
voting_clf = VotingClassifier(estimators=[('lr', model), ('rf', random_forest)])
voting_clf.fit(scaled_data, iris_data.target)
このアンサンブルモデルは、以前にトレーニングしたロジスティック回帰モデル(lr
と呼ばれる)と新しく定義したランダムフォレストモデル(rf
と呼ばれる)を組み合わせます。
モデルのスタッキングとブレンディング
スタッキングやブレンディングのようなより高度なアンサンブル手法は、複数のベースモデルを組み合わせてメタモデルを構築します。ベースモデルを個別にトレーニングした後、メタモデルは最適な性能を発揮するためにそれらをどのように組み合わせるかを学習します。これは単純な平均化や投票アンサンブルよりも柔軟性を提供します。メタラーナーは、異なるデータセグメントでどのモデルが最も優れているかを学習することができます。スタッキングやブレンディングアンサンブルは、さまざまな機械学習タスクで最新の結果を実現することがよくあります。
# ベースモデルのトレーニング
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
rf = RandomForestClassifier()
svc = SVC()
rf.fit(X_train, y_train)
svc.fit(X_train, y_train)
# メタモデルのトレーニングのための予測を作成
rf_predictions = rf.predict(X_test)
svc_predictions = svc.predict(X_test)
# メタモデルのデータセットを作成
blender = np.vstack((rf_predictions, svc_predictions)).T
blender_target = y_test
# 予測を使用してメタモデルをトレーニング
from sklearn.ensemble import GradientBoostingClassifier
gb = GradientBoostingClassifier()
gb.fit(blender, blender_target)
# 最終的な予測を作成
final_predictions = gb.predict(blender)
これはランダムフォレストモデルとSVMモデルを個別にトレーニングし、その予測を使用して勾配ブースティングツリーをトレーニングして最終的な出力を生成します。主なステップは、テストセットからベースモデルの予測を生成し、それらの予測を入力特徴としてメタモデルをトレーニングすることです。
これから先へ
Scikit-learnはPythonでの機械学習のための包括的なツールキットを提供しています。このチュートリアルでは、ライブラリのインストールとその機能の理解からデータの読み込み、モデルのトレーニング、モデルの性能評価、ハイパーパラメータの調整、アンサンブルの作成まで、Scikit-learnを使用した完全な機械学習のワークフローをカバーしました。このライブラリは、設計の良いAPI、多様なアルゴリズム、PyDataスタックとの統合などにより、非常に人気があります。Sklearnを使用することで、実装の詳細にこだわることなく、迅速かつ効率的にモデルを構築し、予測を生成することができます。この堅固な基盤を持っているため、Scikit-learnを使用して実世界の問題に機械学習を実践することができます。次のステップでは、MLの手法を適用できる問題を特定し、このチュートリアルで得たスキルを活用して価値を抽出することが求められます。
もちろん、Scikit-learn特有のことや機械学習全般については常に学ぶべきことがあります。このライブラリは、推定器APIを使用してニューラルネットワーク、マニフォールド学習、そしてディープラーニングなど、最先端のアルゴリズムを実装しています。これらの手法の理論的な仕組みを学ぶことで、常に自己の能力を高めることができます。Scikit-learnは、データ操作の能力を高めるためにPandasなど他のPythonライブラリとも統合されています。さらに、SageMakerのような製品は、Scikit-learnモデルをスケールできるようにするための製品プラットフォームを提供しています。
このチュートリアルはただの出発点です。Scikit-learnは、より高度な課題に取り組むにつれて、モデリングのニーズを満たし続ける多目的なツールキットです。鍵は、実践を重ねてスキルを磨くことです。モデリングのライフサイクル全体での実践的な経験が最も良い教師です。忍耐と創造性を持って、Scikit-learnはあらゆる種類のデータから深い洞察を引き出すためのツールを提供します。
Matthew Mayo(@mattmayo13)は、コンピュータサイエンスの修士号とデータマイニングの大学院の修了証を持っています。VoAGIの編集長として、Matthewは複雑なデータサイエンスの概念を理解しやすくすることを目指しています。彼の専門的な興味は、自然言語処理、機械学習アルゴリズム、新興AIの探索などです。彼はデータサイエンスコミュニティでの知識の民主化を目指して活動しています。Matthewは6歳の時からプログラミングをしています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles