忘記發了 因為報告關係 直接配合gpt實作看看案例
import pandas as pd
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, ConfusionMatrixDisplay
import seaborn as sns
import matplotlib.pyplot as plt
# 加載數據集
data = pd.read_csv('sleep and psychological effects.csv')
# 對目標變量 'Mood_Impact' 進行編碼
label_encoder = LabelEncoder()
data['Mood_Impact'] = label_encoder.fit_transform(data['Mood_Impact'])
# 對類別特徵進行編碼
categorical_columns = ['Gender', 'Favorite_Book_Genre']
data = pd.get_dummies(data, columns=categorical_columns, drop_first=True)
# 定義特徵 (X) 和目標變量 (y)
X = data.drop(columns=['User_ID', 'Mood_Impact'])
y = data['Mood_Impact']
# 將數據集分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# 訓練隨機森林分類器
model = RandomForestClassifier(
random_state=1,
class_weight='balanced',
n_estimators=300,
max_depth=None,
min_samples_split=2,
min_samples_leaf=1
)
model.fit(X_train, y_train)
# 在測試集上進行預測
y_pred = model.predict(X_test)
# 1. 特徵重要性圖
feature_importances = pd.DataFrame({
'Feature': X_train.columns,
'Importance': model.feature_importances_
}).sort_values(by='Importance', ascending=False)
plt.figure(figsize=(10, 6))
plt.barh(feature_importances['Feature'], feature_importances['Importance'], color='skyblue')
plt.xlabel('Importance')
plt.ylabel('Feature')
plt.title('Feature Importance in Random Forest')
plt.gca().invert_yaxis()
plt.show()
# 2. 混淆矩陣
disp = ConfusionMatrixDisplay.from_predictions(
y_test,
y_pred,
display_labels=label_encoder.classes_,
cmap='Blues'
)
plt.title("Confusion Matrix (Non-Normalized)")
plt.show()
# 4.年齡和讀書時間對預測影響的散點圖
plt.figure(figsize=(10, 6))
sns.scatterplot(
x=X_test['Age'],
y=X_test['Weekly_Reading_Time(hours)'],
hue=y_pred,
palette='viridis',
style=y_test,
markers=["o", "s", "D"],
legend='full'
)
plt.title('Effect of Age and Weekly Reading Time on Prediction')
plt.xlabel('Age')
plt.ylabel('Weekly Reading Time (hours)')
plt.legend(title='Predicted Class', loc='best')
plt.show()
cross_val_scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
# 打印交叉驗證準確率
print(f"交叉驗證準確率: {cross_val_scores.mean():.2f} ± {cross_val_scores.std():.2f}")
accuracy = accuracy_score(y_test, y_pred)
print(f"測試集準確率: {accuracy:.2f}")