DAY 22 复习日
复习日
仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。
作业:
自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码
kaggle泰坦里克号人员生还预测
# 导入必要的库
from imblearn.over_sampling import RandomOverSampler
import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 用于评估分类器性能的指标
from sklearn.metrics import classification_report, confusion_matrix #用于生成分类报告和混淆矩阵
import warnings
from sklearn.model_selection import GridSearchCV
from sklearn.utils import compute_class_weight #用于忽略警告信息
warnings.filterwarnings("ignore") # 忽略所有警告信息# 加载数据集
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
# 填充缺失值
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)
train_data['Cabin'].fillna(train_data['Cabin'].mode()[0],inplace=True)
test_data['Fare'].fillna(test_data['Fare'].median(), inplace=True)
train_data=train_data.drop(columns='PassengerId',axis=1)# 特征工程:选择部分特征作为模型输入
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
train_X = pd.get_dummies(train_data[features])
test_X = pd.get_dummies(test_data[features])
train_X=train_X.astype(int)
test_X=test_X.astype(int)
X=train_X
y=train_data['Survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 确保训练集和测试集的特征列一致
X_train, X_test = X_train.align(X_test, join='left', axis=1, fill_value=0)# 目标变量
train_y = train_data['Survived']# 训练模型
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)# 预测
pred = model.predict(X_test)
print("\nrf默认分类报告:")
print(classification_report(y_test, pred))
print("rf默认在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, pred))print("\n--- 2. 网格搜索优化随机森林 (训练集 -> 测试集) ---")
from sklearn.model_selection import GridSearchCV# 定义要搜索的参数网格
param_grid = {'n_estimators': [50, 100, 200],'max_depth': [3, 5, 7, None],'min_samples_split': [2, 5, 10],'min_samples_leaf': [1, 2, 4],'max_features':['sqrt','log',0.3],'class_weight':[None,'balanced']
}# 创建网格搜索对象
grid_search = GridSearchCV(estimator=RandomForestClassifier(random_state=42), # 随机森林分类器param_grid=param_grid, # 参数网格cv=5, # 5折交叉验证n_jobs=-1, # 使用所有可用的CPU核心进行并行计算scoring='accuracy') # 使用准确率作为评分标准# 在训练集上进行网格搜索
grid_search.fit(X_train, y_train) # 在训练集上训练,模型实例化和训练的方法都被封装在这个网格搜索对象里了print("最佳参数: ", grid_search.best_params_) #best_params_属性返回最佳参数组合# 使用最佳参数的模型进行预测
best_model = grid_search.best_estimator_ # 获取最佳模型
best_pred = best_model.predict(X_test) # 在测试集上进行预测print("\n网格搜索优化后的随机森林 在测试集上的分类报告:")
print(classification_report(y_test, best_pred))
print("网格搜索优化后的随机森林 在测试集上的混淆矩阵:")
print(confusion_matrix(y_test, best_pred))
# 预测
predictions=best_model.predict(test_X)
# 生成提交文件
submission = pd.DataFrame({'PassengerId': test_data['PassengerId'],'Survived': predictions
})
print(submission)
rf默认分类报告:precision recall f1-score support0 0.82 0.86 0.84 1051 0.78 0.73 0.76 74accuracy 0.80 179macro avg 0.80 0.79 0.80 179
weighted avg 0.80 0.80 0.80 179rf默认在测试集上的混淆矩阵:
[[90 15][20 54]]--- 2. 网格搜索优化随机森林 (训练集 -> 测试集) ---
最佳参数: {'class_weight': None, 'max_depth': 5, 'max_features': 'sqrt', 'min_samples_leaf': 1, 'min_samples_split': 2, 'n_estimators': 200}网格搜索优化后的随机森林 在测试集上的分类报告:precision recall f1-score support0 0.81 0.88 0.84 1051 0.80 0.70 0.75 74accuracy 0.80 179macro avg 0.80 0.79 0.79 179
weighted avg 0.80 0.80 0.80 179网格搜索优化后的随机森林 在测试集上的混淆矩阵:
[[92 13][22 52]]PassengerId Survived
0 892 0
1 893 0
2 894 0
3 895 0
4 896 1
.. ... ...
413 1305 0
414 1306 1
415 1307 0
416 1308 0
417 1309 0[418 rows x 2 columns]
最后转化为csv文件:
submission.to_csv('submission.csv', index=False)
总结:
两个模型在预测性能上没有显著差异,准确率相同,其他指标也非常接近。
@浙大疏锦行