この章では、データセットを使用し、データの前処理から機械学習モデルの構築、モデルの評価、さらにはチューニングやデプロイに至るまでの一連のプロセスを通して、実際の業務やプロジェクトに応用できる知識を提供します。
6.1 データセットを使った実践例
6.1.1 データセットの選定
最初に取り組むべきは、使用するデータセットの選定です。一般的に、初学者が扱いやすいデータセットとして、以下のようなものが考えられます。
- Irisデータセット:植物のアヤメの花の特徴(がく片や花弁の長さ)から、その品種を分類するタスクです。データセットが小さく、分類タスクの基本を学ぶのに最適です。
- Titanic生存者予測データセット:有名なタイタニック号の乗客情報を使って、生存者を予測するタスクです。実際のデータに欠損値が含まれており、前処理のスキルも学べます。
- House Pricesデータセット:家の特徴(広さや部屋数、場所など)から価格を予測する回帰タスクです。
ここでは、初心者でも取り組みやすく、また実務にもつながるタスクとして、Titanic生存者予測データセットを使用します。このデータは、Kaggleでも非常に人気のあるデータセットで、初学者が学びながら実際のプロジェクトに応用できる要素が詰まっています。
6.1.2 データセットの取得と読み込み
まず、Pandasを使用してデータセットを読み込みます。Kaggleからデータをダウンロードし、以下のコードで読み込むことができます。
import pandas as pd
# データセットの読み込み
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
# データの先頭部分を表示
print(train_data.head())
ここでは、train.csv
がトレーニングデータ、test.csv
がテストデータです。train.csv
は、生存者の情報が含まれており、機械学習モデルの訓練に使用します。test.csv
は、生存者の情報が含まれておらず、予測結果をKaggleに提出する際に使用されます。
6.1.3 データの確認と前処理
次に、データの内容を確認し、前処理を行います。機械学習モデルを構築する前に、データに欠損値や外れ値がないか確認することが重要です。
# データの情報を確認
print(train_data.info())
# 欠損値の確認
print(train_data.isnull().sum())
この出力により、データセットの各列にどれだけの欠損値があるかを確認できます。例えば、Age
(年齢)やCabin
(キャビン)の情報に欠損値が多く含まれていることがわかるかもしれません。
欠損値の処理
欠損値がある場合、その処理方法には主に以下の方法があります。
- 欠損値を削除する:欠損値のある行や列を削除する方法です。ただし、重要な情報を失う可能性があります。
- 欠損値を埋める:中央値や平均値、モードなどで欠損値を埋める方法です。
ここでは、年齢の欠損値を年齢の中央値で埋め、キャビンの情報は削除します。
# Ageの欠損値を中央値で埋める
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
# Cabin列を削除
train_data.drop(columns='Cabin', inplace=True)
# 再度、欠損値を確認
print(train_data.isnull().sum())
カテゴリデータの変換
次に、Sex
(性別)やEmbarked
(乗船した港)のようなカテゴリデータは、そのままでは機械学習モデルに使用できないため、数値に変換します。これには、pd.get_dummies
を使用します。
# 性別を数値に変換
train_data['Sex'] = train_data['Sex'].map({'male': 0, 'female': 1})
# Embarkedのダミー変数を作成
train_data = pd.get_dummies(train_data, columns=['Embarked'])
# データの確認
print(train_data.head())
これにより、性別が 0
(男性)と 1
(女性)に変換され、Embarked
が複数の列に分割されて数値化されます。
6.1.4 データの分割
データが前処理されましたので、次にデータをトレーニングセットとテストセットに分割します。これは、モデルの評価に使用します。
from sklearn.model_selection import train_test_split
# 目的変数と特徴量に分割
X = train_data.drop(columns=['Survived'])
y = train_data['Survived']
# トレーニングセットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(f'Training data shape: {X_train.shape}')
print(f'Test data shape: {X_test.shape}')
これでデータが準備できました。次に、モデルを構築していきます。
6.2 機械学習モデルの構築
6.2.1 ロジスティック回帰モデルの構築
まず、基本的な分類モデルとして、ロジスティック回帰を使用してモデルを構築します。scikit-learn
ライブラリの LogisticRegression
を使用して実装します。
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# ロジスティック回帰モデルのインスタンスを作成
model = LogisticRegression(max_iter=1000)
# モデルをトレーニング
model.fit(X_train, y_train)
# テストデータで予測
y_pred = model.predict(X_test)
# モデルの精度を評価
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.4f}')
ここでは、LogisticRegression
を使用してモデルを訓練し、テストデータでの精度を確認しています。機械学習プロジェクトでは、精度だけでなく他の評価指標も確認する必要があります。
6.2.2 その他のアルゴリズム
ロジスティック回帰以外にも、他の分類アルゴリズムを試してみることが有益です。例えば、決定木やランダムフォレストを使用することで、異なるアプローチからモデルのパフォーマンスを向上させることができます。
決定木モデル
from sklearn.tree import DecisionTreeClassifier
# 決定木モデルのインスタンスを作成
tree_model = DecisionTreeClassifier()
# モデルをトレーニング
tree_model.fit(X_train, y_train)
# テストデータで予測
y_pred_tree = tree_model.predict(X_test)
# モデルの精度を評価
accuracy_tree = accuracy_score(y_test, y_pred_tree)
print(f'Decision Tree Accuracy: {accuracy_tree:.4f}')
ランダムフォレストモデル
from sklearn.ensemble import RandomForestClassifier
# ランダムフォレストモデルのインスタンスを作成
rf_model = RandomForestClassifier()
# モデルをトレーニング
rf_model.fit(X_train, y_train)
# テストデータで予測
y_pred_rf = rf_model.predict(X_test)
# モデルの精度を評価
accuracy_rf = accuracy_score(y_test, y_pred_rf)
print(f'Random Forest Accuracy: {accuracy_rf:.4f}')
これで、複数のアルゴリズムを使用してモデルを構築し、どのモデルが最も高い精度を示すか比較することができます。
6.3 モデルのチューニングとデプロイ
6.3.1 ハイパーパラメータのチューニング
モデルの精度をさらに向上させるためには、ハイパーパラメータのチューニングが重要です。GridSearchCV
を使用して、モデルの最適なパラメータを探索することができます。
from sklearn.model_selection import GridSearchCV
# ハイパーパラメータの候補を定義
param_grid = {
'n_estimators': [100, 200, 300],
'max_depth': [None, 10, 20, 30],
'min_samples_split': [2, 5, 10]
}
# GridSearchCVを使用して最適なパラメータを探索
grid_search = GridSearchCV(RandomForestClassifier(), param_grid, cv=5)
# トレーニング
grid_search.fit(X_train, y_train)
# 最適なパラメータを表示
print(f'Best Parameters: {grid_search.best_params_}')
これにより、ランダムフォレストの最適なハイパーパラメータを見つけ出すことができ、モデルのパフォーマンスを向上させることができます。
6.3.2 モデルのデプロイ
モデルが完成したら、実際に運用環境にデプロイすることを検討します。簡単な方法としては、予測結果をファイルに保存し、APIやウェブアプリケーションとして提供することです。
# テストデータに対して予測
predictions = model.predict(test_data)
# 予測結果を保存
submission = pd.DataFrame({
'PassengerId': test_data['PassengerId'],
'Survived': predictions
})
submission.to_csv('submission.csv', index=False)
このようにして、予測結果をKaggleなどのプラットフォームに提出できる形式で保存することができます。
まとめ
この章では、Titanicデータセットを使用して、Pythonで実際の機械学習プロジェクトを進める方法について学びました。データの前処理、モデルの構築、チューニング、さらにはデプロイまでの一連の流れを体験しました。これらのスキルは、実務でも役立つものですので、ぜひ自分のプロジェクトに応用してみてください。
初心者におすすめ!プログラミングスクールのススメ
未経験でも気軽に!サブスク型プログラミングスクール【Freeks】
プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。
独学の挫折率、驚きの87.5%!
独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。
有料と無料、スクールの違いは?
プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:
- 受講条件が異なる
- 学べるスキルやカリキュラム内容が異なる
- 就職や転職のサポート内容が異なる
どちらが自分に合っているか、よく考えて選ぶのが大事です。
サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!
プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:
- 未経験者向けのわかりやすいカリキュラム
- 経験豊富なエンジニアのサポート
- オンラインで自分のペースで学習可能
なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。
終了後は副業もサポート!
カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。
独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
↓ ↓ こちらをクリック ↓ ↓