scikit-learnは、Pythonでデータ分析を行う際に非常に便利な機械学習ライブラリです
多くの機械学習アルゴリズムや便利なツールが用意されており、初心者から上級者まで幅広く利用されています
この記事では、scikit-learnの基本的な使い方や上手い使い方を解説していきます
これからデータ分析を0から学び始める方は、Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップも合わせて参考にしてください
筆者について
2021年から本格的にPython学習を始め、今ではPythonによる収益化に成功
大学院時代には、R言語とPythonを使って統計処理を行っていたため、Pythonを使ったデータサイエンスの知識が豊富
医療データを機械学習を用いて解析したり、学会発表も行なっている
Contents
scikit-learnとは
scikit-learnは、Pythonで機械学習を実践するためのオープンソースライブラリで、データサイエンティストや機械学習エンジニアに広く利用されています
シンプルで使いやすいAPIが魅力であり、多様な機械学習アルゴリズムやデータ前処理手法が実装されています
scikit-learnのインストール方法
scikit-learnをインストールするには、pipを利用して以下のコマンドを実行します。
pip install scikit-learn
Anacondaを使っている場合には、
conda install scikit-learn
scikit-learnの活用方法
scikit-learnは、Pythonでデータ分析を行うための強力なライブラリで、機械学習アルゴリズムを簡単に実装できます
主な機能には、分類・回帰・クラスタリング・次元削減・モデル選択・前処理などが含まれます
scikit-learnを活用することで、データセットの前処理や欠損値の補完、カテゴリ変数のエンコーディング、データの正規化・標準化などが容易に行えます
また、線形回帰やロジスティック回帰などの機械学習手法の実装やモデルの評価・チューニングが効率的に行えるため、データ分析のプロセスをスムーズに進めることができます
scikit-learnの基本的なデータ前処理
データ分析を行う前に、データを前処理することが重要です
scikit-learnでは、次のような前処理が可能です
- 欠損値の補完
- データの正規化・標準化
- カテゴリ変数のエンコーディング
欠損値の補完
欠損値の補完は、データセット内の欠損値(NaNやnullなど)を適切な値で埋める処理です
欠損値をそのままにしておくと、機械学習モデルの精度や効率が低下することがあります
scikit-learnでは、SimpleImputer
クラスを使って簡単に欠損値の補完ができます
import numpy as np
from sklearn.impute import SimpleImputer
data = np.array([
[1, np.nan, 3],
[4, 5, np.nan],
[np.nan, 7, 8],
])
# 平均値で欠損値を補完
imputer = SimpleImputer(strategy='mean')
imputed_data = imputer.fit_transform(data)
print(imputed_data)
サンプルコードでは、SimpleImputer
をインポートし、欠損値を含むデータセットdata
を定義しています
strategy='mean'
は、各列の平均値で欠損値を補完することを意味します
fit_transform()
メソッドを使って、欠損値を補完したデータセットimputed_data
を生成しています
SimpleImputer
のstrategy
パラメータには、他にもmedian
(中央値)、most_frequent
(最頻値)、constant
(指定した定数)などのオプションがあります
適切な補完方法を選択することで、機械学習モデルの性能を向上させることができます
欠損値の補完も、データ前処理の重要なステップです
データ分析を0から始める方は、Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップの記事も参考にしてください
データの正規化・標準化
データの正規化と標準化は、特徴量のスケールを揃えることで、機械学習モデルの性能を向上させるための前処理手法です
scikit-learnでは、MinMaxScaler
とStandardScaler
が提供されています
正規化 (MinMaxScaler)
正規化は、データを0から1の範囲にスケーリングします
MinMaxScalerを使用すると、次のように正規化を実行できます
from sklearn.preprocessing import MinMaxScaler
import numpy as np
data = np.array([[10, 2], [5, 6], [8, 4]])
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
print(normalized_data)
標準化 (StandardScaler)
標準化は、データの平均を0、標準偏差を1にすることでスケーリングを行います
StandardScalerを使用すると、次のように標準化を実行できます
from sklearn.preprocessing import StandardScaler
data = np.array([[10, 2], [5, 6], [8, 4]])
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data)
print(standardized_data)
カテゴリ変数のエンコーディング
カテゴリ変数は、数値データではないデータで、機械学習モデルが扱える形式に変換する必要があります
scikit-learnでは、LabelEncoder
やOneHotEncoder
が提供されています。
LabelEncoder
LabelEncoderは、カテゴリ変数を整数に変換します
これにより、順序尺度のカテゴリ変数を適切に表現できます
LabelEncoderを使用すると、次のようにエンコーディングを行えます
from sklearn.preprocessing import LabelEncoder
data = ['red', 'blue', 'green', 'blue', 'red']
encoder = LabelEncoder()
encoded_data = encoder.fit_transform(data)
print(encoded_data)
OneHotEncoder
OneHotEncoderは、カテゴリ変数をバイナリベクトルに変換します
これにより、名義尺度のカテゴリ変数を適切に表現できます
OneHotEncoderを使用すると、次のようにエンコーディングを行えます。
from sklearn.preprocessing import OneHotEncoder
data = [['red'], ['blue'], ['green'], ['blue'], ['red']]
encoder = OneHotEncoder(sparse=False)
encoded_data = encoder.fit_transform(data)
print(encoded_data)
前処理手法を活用することで、データを機械学習モデルに適した形式に変換できます
正規化・標準化やカテゴリ変数のエンコーディングを適切に行うことで、モデルの学習効率を向上させ、精度を高めることが可能になります
前処理手法は、データ分析の過程で重要な役割を果たすため、Python データ分析の基本となる技術です
scikit-learnを使用して、これらの前処理手法を習得し、データ分析プロジェクトに活用しましょう
代表的な機械学習アルゴリズム
scikit-learnでは、以下のような機械学習アルゴリズムが用意されています
- 線形回帰
- ロジスティック回帰
- サポートベクターマシン
- 決定木
- ランダムフォレスト
- k近傍法
- 主成分分析(PCA)
それぞれのアルゴリズムについては、別の記事で詳しく解説していますので、参考にしてください
モデルの訓練と評価
モデルの訓練と評価は、scikit-learnを使用したデータ分析の中核部分です
以下の手順でモデルを訓練し、評価を行います。
- データを訓練データとテストデータに分割する
- アルゴリズムを選択してモデルを生成する
- 訓練データを用いてモデルを訓練する
- テストデータを用いてモデルを評価する
今回紹介するのは、ロジスティック回帰を使ってモデルを訓練し、評価するサンプルコードです
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
# データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# モデルの生成
model = LogisticRegression()
# モデルの訓練
model.fit(X_train, y_train)
# モデルの評価
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy}")
ハイパーパラメータチューニング
モデルの性能を向上させるためには、ハイパーパラメータチューニングが重要です
scikit-learnでは、GridSearchCV
やRandomizedSearchCV
などのクラスを使って、簡単にハイパーパラメータチューニングができます
以下は、ランダムフォレストのハイパーパラメータチューニングのサンプルコードです
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
# データの読み込み
iris = load_iris()
X = iris.data
y = iris.target
# モデルの生成
model = RandomForestClassifier()
# ハイパーパラメータの候補
param_grid = {
'n_estimators': [10, 50, 100, 200],
'max_depth': [None, 10, 20, 30]
}
# グリッドサーチ
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X, y)
# 最適なハイパーパラメータの表示
print("Best parameters: ", grid_search.best_params_)
scikit-learnの学ぶべき内容
ここまでで、scikit-learnの基本的な使い方を紹介しましたが、まだまだ学ぶべき内容はたくさんあります
以下は、さらに学ぶべき内容の一部です
- 特徴量選択
- アンサンブル学習
- クロスバリデーション
- モデルの保存と読み込み
- カスタム機械学習アルゴリズムの実装
- パイプラインの構築
ここからは、上記の内容を簡単に解説をしていきます
特徴量選択
特徴量選択は、データセット内の重要な特徴を選択し、不要な特徴を削除するプロセスです
これにより、モデルの計算負荷が減り、過学習のリスクが低減されます
scikit-learnでは、SelectKBest
やRFE
(Recursive Feature Elimination)などの特徴量選択アルゴリズムが提供されています
アンサンブル学習
アンサンブル学習は、複数のモデルを組み合わせて、より高い精度を達成する手法です
scikit-learnでは、バギング、ブースティング、ランダムフォレスト、勾配ブースティングなどのアンサンブル手法が提供されています
これらの手法は、異なるモデルの弱点を補完し合い、全体としてより良い予測を行うことができます
クロスバリデーション
クロスバリデーションは、データセットを複数の部分に分割し、それぞれの部分をテストセットとして用いることで、モデルの評価を行う方法です
これにより、モデルの性能が新しいデータに対してどれほど汎用性があるかを評価できます
scikit-learnのcross_val_score
関数を使用して、簡単にクロスバリデーションを実行できます。
モデルの保存と読み込み
訓練済みのモデルを保存して、後で再利用することができます
これにより、訓練時間が短縮され、再利用が容易になります
scikit-learnでは、joblib
ライブラリを使用して、モデルを簡単に保存および読み込むことができます
カスタム機械学習アルゴリズムの実装
既存のアルゴリズムだけでは不十分な場合、独自の機械学習アルゴリズムを実装することも可能です
scikit-learnでは、カスタムアルゴリズムをBaseEstimator
およびRegressorMixin
またはClassifierMixin
を継承したクラスとして実装することができます
これにより、独自のアルゴリズムをscikit-learnの他のツールと同様に利用できるようになります
パイプラインの構築
scikit-learnでは、データ前処理、特徴量選択、モデル学習、評価などの一連の処理をパイプラインとして組み立てることができます
Pipeline
クラスを使用することで、処理手順を簡潔に記述し、コードの見通しを良くすることができます
また、パイプラインを使用することで、データリークを防止し、モデルの再利用が容易になります。
まとめ
今回の記事では、scikit-learnを使ったデータ分析における重要な概念や手法について詳しく述べました
これらの知識を活用して、Pythonでのデータ分析プロジェクトを効率的に進めることができるでしょう
さらなる情報や実践的なガイドについては、「Pythonでデータ分析を始めよう!挫折しない実践ガイドでスキルアップ」を参照してください