素人がChatGPTを使って”タイタニックコンペ”に参加するまでのお話(予測精度を上げたい!!)
はじめに
こんにちは!ChatGPT部の原田です!前回、アドバイスを受けChatGPTのみで予測をすることができました!
ただ前処理などを全くしていませんでしたので、今回は、前処理などをしてより精度を上げようと思います!
前回の記事はこちら!↓
では早速!
1. 準備
まずは準備から!
新しいチャットを開きプロンプト、もちろんデータも添付します!
準備はたったのこれだけ!簡単です!
2. 予測開始!
まずはデータの確認!
しっかり読み込み完了!次に、
前処理!
1回目、エラー発生!!
適切な処理を進めてもらうと、、、
できたみたい!
3. 結果
提出用ファイルを作成してくれました!
中身は前回見たので今回は省略、
気になるのは精度!!!!
結果は、、、
78%▶▶▶82%!!!向上しました!前処理は大事です笑
ちなみに、
根拠を、、、以下ChatGPTからの回答です!
今回のタイタニック予測では、以下の特徴量を使用してランダムフォレストモデルを作成しました。これらの特徴量は、乗客が生存するかどうかを予測するための重要なデータポイントです。
使用した特徴量
PassengerId: 乗客の識別番号(ID)。ただし、これは予測に直接関係しないため、インデックス的な役割のみです。
Pclass: チケットクラス(1等、2等、3等)。一般的に、1等の乗客は生存率が高い傾向にあります。
Sex: 性別。女性の生存率が男性よりも高い傾向にあるため、重要な特徴量です。
Age: 年齢。子供や若者の方が生存率が高い傾向にありますが、欠損値が多かったため、中央値で補完しました。
SibSp: 兄弟姉妹や配偶者の数。家族が一緒にいるかどうかは、避難の際に影響する可能性があります。
Parch: 親または子供の数。同様に、家族構成が生存率に影響する可能性があります。
Fare: 運賃。高額な運賃を支払った乗客は、上等クラスである可能性が高く、生存率が高いことがあります。
Embarked: 乗船した港(C = Cherbourg、Q = Queenstown、S = Southampton)。乗船場所により若干の生存率の差があることがわかっています。
除外した特徴量
Cabin: キャビン番号。欠損が多く、正確な影響を反映するのが難しかったため除外しました。
Ticket: チケット番号。テキストデータであり、今回のモデルにおいては予測に直接役立てるのが難しいため除外しました。
Name: 名前。名前には「敬称(Mr.、Mrs.など)」が含まれ、潜在的に年齢や社会的地位に関連する可能性がありますが、今回は省略しました。
これらの特徴量をもとに、ランダムフォレストモデルで予測を行いました。性別や年齢、クラス(Pclass)が予測に大きく影響する重要な要素として機能しました。
なるほど、除外理由まで!
ここで特徴量の重要度ランキング!!
結果は…
以下ChatGPTからの回答です!
ランダムフォレストモデルによる特徴量の重要度は、上記の表やグラフで確認できます。特に、性別(Sex) や 運賃(Fare) が予測において非常に重要な特徴量であることがわかります。また、年齢(Age) や チケットクラス(Pclass) も影響が大きい特徴量です。
これらの特徴量は、モデルの予測性能に大きく貢献していることがわかります。
言ってもいないのにグラフ化もしてくれました!
まとめ
今回は前回と違い、前処理後、ランダムフォレストを使用して予測を行っていきました!
精度も向上しどんなデータが大事なのかもグラフでわかりやすく教えてもらいました!次回は違う予測方法で精度が上がるか試していきます!今回は以上です!(^^)
使用したコード
以下にコードをまとめておきます!参考までに!
データの確認
# First, let's load the provided files and inspect them
import pandas as pd
# Load the data files
train_data = pd.read_csv('/mnt/data/train.csv')
test_data = pd.read_csv('/mnt/data/test.csv')
gender_submission = pd.read_csv('/mnt/data/gender_submission.csv')
# Display the first few rows of each dataset for inspection
train_data.head(), test_data.head(), gender_submission.head()
前処理&予測
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder
# 欠損値の確認
train_data.isnull().sum(), test_data.isnull().sum()
# AgeとEmbarkedの欠損を埋めるために、年齢は中央値、Embarkedは最頻値で埋める
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
test_data['Age'].fillna(test_data['Age'].median(), inplace=True)
train_data['Embarked'].fillna(train_data['Embarked'].mode()[0], inplace=True)
test_data['Embarked'].fillna(test_data['Embarked'].mode()[0], inplace=True)
# Cabinの情報は多くの欠損があるので、これは除外します
train_data.drop('Cabin', axis=1, inplace=True)
test_data.drop('Cabin', axis=1, inplace=True)
# Ticketもテキスト情報が多いため除外します
train_data.drop('Ticket', axis=1, inplace=True)
test_data.drop('Ticket', axis=1, inplace=True)
# 名前も複雑なため、今回は除外します
train_data.drop('Name', axis=1, inplace=True)
test_data.drop('Name', axis=1, inplace=True)
# カテゴリ変数であるSexとEmbarkedをLabelEncoderを使って数値に変換
le = LabelEncoder()
train_data['Sex'] = le.fit_transform(train_data['Sex'])
test_data['Sex'] = le.transform(test_data['Sex'])
train_data['Embarked'] = le.fit_transform(train_data['Embarked'])
test_data['Embarked'] = le.transform(test_data['Embarked'])
# 訓練データとターゲットデータに分割
X = train_data.drop('Survived', axis=1)
y = train_data['Survived']
# 訓練データとテストデータに分割
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# ランダムフォレストモデルの作成
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 検証データで予測
y_pred = rf_model.predict(X_val)
accuracy = accuracy_score(y_val, y_pred)
# テストデータでの予測を行う
test_predictions = rf_model.predict(test_data)
accuracy, test_predictions[:10] # accuracy on validation set and first 10 test predictions
欠損値修正
# テストデータの欠損値を確認
test_data.isnull().sum()
# Fareの欠損があるため、これを中央値で埋める
test_data['Fare'].fillna(test_data['Fare'].median(), inplace=True)
# 再度テストデータでの予測を行います
test_predictions = rf_model.predict(test_data)
test_predictions[:10] # First 10 test predictions
提出形式に整えて保存
# 提出用のデータフレームを作成
submission = pd.DataFrame({
'PassengerId': test_data['PassengerId'],
'Survived': test_predictions
})
# ファイルとして保存
submission.to_csv('/mnt/data/titanic_submission.csv', index=False)
# 提出用ファイルを作成しました
submission.head()
予測精度の表示
# 既に検証データでの予測を行ったので、その時の精度を表示します
accuracy
特徴量の重要度
# 特徴量の重要度を確認します
importances = rf_model.feature_importances_
feature_names = X.columns
# データフレームにして、重要度が高い順にソート
feature_importance_df = pd.DataFrame({
'Feature': feature_names,
'Importance': importances
}).sort_values(by='Importance', ascending=False)
import matplotlib.pyplot as plt
# 特徴量の重要度を可視化
plt.figure(figsize=(10, 6))
plt.barh(feature_importance_df['Feature'], feature_importance_df['Importance'])
plt.xlabel('Importance')
plt.ylabel('Feature')
plt.title('Feature Importance in Random Forest')
plt.gca().invert_yaxis() # 特徴量の順序を逆にする(重要なものを上に表示)
plt.show()
# 表形式でも確認
import ace_tools as tools; tools.display_dataframe_to_user(name="Feature Importance", dataframe=feature_importance_df)