Titanic - Machine Learning from Disaster————泰坦尼克号幸存者预测————逻辑回归、随机森林和梯度提升树(XGBoost、LightGBM)

news2024/12/16 16:48:37

目录

1. 引言

2. 理解 Titanic 数据集

目标变量

数据的初步探索

3. 数据预处理

3.1 处理缺失值

3.2 处理类别型特征

3.3 创建新特征

3.4 删除无关特征

3.5 确保所有特征都是数值型

4. 模型选择与训练

4.1 数据集拆分

4.2 选择和训练模型

4.2.1 逻辑回归模型

4.2.2 随机森林模型

4.2.3 XGBoost

4.2.4 LightGBM

4.3 模型评估与比较

5. 模型优化与调参

5.1 超参数调优

超参数调优的方法

5.2 特征选择

常用的特征选择方法

5.3 模型集成


1. 引言

在数据科学领域,Titanic 数据集是一个非常经典的入门练习题。它是基于 1912 年著名的泰坦尼克号沉船事件的实际数据,目标是通过已知的乘客信息预测某位乘客是否能够在灾难中幸存下来。这不仅是一个有趣的历史案例,也为初学者提供了一个很好的机会来学习如何处理分类问题,应用机器学习算法并进行模型评估。

在这篇博客中,将带你一步一步地完成 Titanic 生还预测任务,主要涵盖以下几个方面:

  • 理解数据的基本结构。
  • 如何处理数据中的缺失值和类别型特征。
  • 通过特征工程来提高模型的表现。
  • 使用多个常见的机器学习模型来进行预测,包括逻辑回归、随机森林和梯度提升树(XGBoost、LightGBM)。
  • 通过准确率、F1 分数和 AUC-ROC 等指标对模型进行评估,并解释这些指标的意义。

无论是刚接触机器学习,还是正在寻找提升模型表现的方法,希望这篇博客能帮助你顺利完成 Titanic 生还预测的初学者任务。

2. 理解 Titanic 数据集

在开始构建模型之前,我们首先需要深入理解 Titanic 数据集的结构。这个数据集包含了泰坦尼克号乘客的相关信息,包括他们的基本背景、船舱信息以及是否幸存(Survived)。以下是一些主要的特征:

  • PassengerId:乘客编号(无关特征,可以删除)。
  • Pclass:客舱等级(1, 2, 3),代表社会经济地位。
  • Name:乘客姓名,可以从中提取称谓(如 Mr., Mrs. 等),为后续特征工程提供信息。
  • Sex:乘客的性别,幸存率与性别高度相关。
  • Age:乘客的年龄,有些年龄值缺失,需要进行填充。
  • SibSp:兄弟姐妹/配偶人数,表示乘客随行家人数量。
  • Parch:父母/子女人数,表示乘客随行的父母或子女数量。
  • Ticket:票号,可能不是直接有用的特征,但可以探索。
  • Fare:票价,可以进行分段处理以便更好地进行建模。
  • Cabin:船舱号码,大部分缺失,可以进行分组处理。
  • Embarked:登船港口(C = Cherbourg, Q = Queenstown, S = Southampton),部分缺失,需要填充。
目标变量
  • Survived:生还情况(0 = 未生还, 1 = 生还),这是我们的目标变量。
数据的初步探索

在机器学习项目的早期阶段,初步的数据探索(EDA, Exploratory Data Analysis)非常重要。通过 EDA,我们可以发现数据中的模式、不平衡、缺失值等问题。可以用以下方式简单检查数据:

import pandas as pd

# 读取数据
data = pd.read_csv('train.csv')

# 查看数据前几行
print(data.head())

# 检查数据的总体信息,缺失值和数据类型
print(data.info())

# 查看每个特征的基本统计信息
print(data.describe())

data.head()的打印结果

data.info()的打印结果

data.describe()的打印结果

通过上述代码,你可以清楚地了解数据中的每个特征,特别是它们的类型、缺失值情况和数值分布。这是我们接下来要进行数据预处理和特征工程的基础。

在接下来的部分,我们将介绍如何处理这些数据问题,为建模做好准备。

3. 数据预处理

在我们正式开始构建模型之前,需要对 Titanic 数据集进行数据预处理。这一步是非常关键的,因为原始数据通常包含缺失值、不平衡特征或非数值型特征,这些都会影响模型的表现。

3.1 处理缺失值

在 Titanic 数据集中,部分特征(如 AgeCabinEmbarked)存在缺失值。如果不处理这些缺失值,模型训练时会报错或表现不佳。

  • Age:这是一个重要的特征,但存在较多缺失值。一个常见的处理方法是用乘客所在 Pclass (客舱等级)的中位数年龄来填充缺失值。
  • Embarked:表示乘客登船港口,缺失值较少,可以用出现频率最高的港口(众数)来填充。
  • Cabin:此特征的缺失值很多,通常选择删除该列,或者只提取出有用的信息(如提取首字母代表船舱的分布)。
  • # 填充 Age 缺失值,按 Pclass 的中位数年龄填充
    data['Age'] = data.groupby('Pclass')['Age'].transform(lambda x: x.fillna(x.median()))
    
    # 填充 Embarked 缺失值,使用出现频率最高的值
    data['Embarked'].fillna(data['Embarked'].mode()[0], inplace=True)
    
    # 删除 Cabin 列,因其缺失值过多
    data.drop(columns=['Cabin'], inplace=True)
    
3.2 处理类别型特征

机器学习算法无法直接处理类别型特征,因此我们需要将其转换为数值型特征。常见的做法是 独热编码(One-Hot Encoding),它将类别型变量转换为多个二进制特征。

  • SexMaleFemale 转换为 0 和 1。
  • Embarked:将登船港口转换为独热编码。
  • Pclass:客舱等级也是一个类别型特征,可以保留原数值形式,或者转换为独热编码。
    # 独热编码处理 Sex 和 Embarked 特征
    data = pd.get_dummies(data, columns=['Sex', 'Embarked'], drop_first=True)
    
    # Pclass 可以保留原数值,不需要处理
    
3.3 创建新特征

为了提高模型的预测能力,特征工程可以帮助我们从现有数据中创建更多有用的特征。

  • FamilySize:通过 SibSpParch 计算乘客的家庭规模。
  • IsAlone:当 FamilySize 为 1 时,表示乘客独自一人。
  • Title:从乘客的姓名中提取称谓(如 Mr., Mrs., Miss. 等)。
    # 创建 FamilySize 特征
    data['FamilySize'] = data['SibSp'] + data['Parch'] + 1
    
    # 创建 IsAlone 特征
    data['IsAlone'] = (data['FamilySize'] == 1).astype(int)
    
    # 从姓名中提取称谓(Title),并简化为常见的类别
    data['Title'] = data['Name'].str.extract(r' ([A-Za-z]+)\.', expand=False)
    data['Title'] = data['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    data['Title'] = data['Title'].replace('Mlle', 'Miss')
    data['Title'] = data['Title'].replace('Ms', 'Miss')
    data['Title'] = data['Title'].replace('Mme', 'Mrs')
    
    # 独热编码处理 Title 特征
    data = pd.get_dummies(data, columns=['Title'], drop_first=True)
    
    3.4 删除无关特征

    一些特征与生还预测关系不大,或者无法直接用作模型输入,因此需要删除这些特征。例如:

  • PassengerId:仅为标识符,不提供有用信息。
  • NameTicket:文本信息不适合作为模型特征
    # 删除无关特征
    data.drop(columns=['PassengerId', 'Name', 'Ticket'], inplace=True)
    
    3.5 确保所有特征都是数值型

    经过上述处理后,我们已经将所有类别型特征转换为数值型特征,并删除了无关的列。我们可以检查数据的类型,确保所有特征都适合输入到机器学习模型中。

    # 检查数据类型
    print(data.dtypes)
    

    数据类型的打印如下

       

4. 模型选择与训练

在完成数据预处理后,接下来我们进入模型选择与训练的阶段。初学者可以尝试使用几种经典的机器学习模型来预测乘客的生还情况。常用的模型包括:

通过这些指标,可以清晰地评估模型的优劣,并根据具体应用场景选择合适的模型。

各模型的评估如下:

逻辑回归模型 - 准确率: 0.7989, F1分数: 0.7534, AUC-ROC: 0.8865
随机森林模型 - 准确率: 0.8380, F1分数: 0.8079, AUC-ROC: 0.8993
XGBoost模型 - 准确率: 0.8324, F1分数: 0.7945, AUC-ROC: 0.9041
LightGBM模型 - 准确率: 0.8492, F1分数: 0.8163, AUC-ROC: 0.8997

  • 逻辑回归(Logistic Regression)
  • 随机森林(Random Forest)
  • 梯度提升决策树(Gradient Boosting Decision Trees),如 XGBoost 和 LightGBM
    4.1 数据集拆分

    在训练模型之前,我们需要将数据集分为训练集和测试集,确保模型的泛化能力。通常会采用 80% 的数据用于训练,20% 的数据用于测试。

    from sklearn.model_selection import train_test_split
    
    # 特征和目标变量
    X = data.drop('Survived', axis=1)  # 特征
    y = data['Survived']  # 目标变量
    
    # 数据集拆分
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    4.2 选择和训练模型

    对于初学者来说,选择简单且解释性强的模型开始是一个不错的选择。以下是几个常用的模型及其简单的训练方法:

    4.2.1 逻辑回归模型

    逻辑回归是一种用于二分类问题的简单模型,易于理解并且通常有不错的表现。

    from sklearn.linear_model import LogisticRegression
    from sklearn.metrics import accuracy_score, f1_score, roc_auc_score
    
    # 初始化并训练模型
    logreg = LogisticRegression(max_iter=200)
    logreg.fit(X_train, y_train)
    
    # 预测
    y_pred = logreg.predict(X_test)
    y_prob = logreg.predict_proba(X_test)[:, 1]
    
    # 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)
    roc_auc = roc_auc_score(y_test, y_prob)
    
    print(f"逻辑回归模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
    
    4.2.2 随机森林模型

    随机森林是一个集成学习方法,通过多个决策树的预测结果进行投票,具有较好的稳定性和性能。

    from sklearn.ensemble import RandomForestClassifier
    
    # 初始化并训练模型
    rf = RandomForestClassifier(n_estimators=100, random_state=42)
    rf.fit(X_train, y_train)
    
    # 预测
    y_pred = rf.predict(X_test)
    y_prob = rf.predict_proba(X_test)[:, 1]
    
    # 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)
    roc_auc = roc_auc_score(y_test, y_prob)
    
    print(f"随机森林模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
    
    4.2.3 XGBoost

    XGBoost 是一种高效的梯度提升树模型,常用于结构化数据的分类任务,效果显著。

    from xgboost import XGBClassifier
    
    # 初始化并训练模型
    xgb = XGBClassifier(eval_metric='logloss', use_label_encoder=False, random_state=42)
    xgb.fit(X_train, y_train)
    
    # 预测
    y_pred = xgb.predict(X_test)
    y_prob = xgb.predict_proba(X_test)[:, 1]
    
    # 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)
    roc_auc = roc_auc_score(y_test, y_prob)
    
    print(f"XGBoost模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
    
    
    4.2.4 LightGBM

    LightGBM 是另一种梯度提升树模型,特别擅长处理大规模数据集。

  • from lightgbm import LGBMClassifier
    
    # 初始化并训练模型
    lgbm = LGBMClassifier(random_state=42)
    lgbm.fit(X_train, y_train)
    
    # 预测
    y_pred = lgbm.predict(X_test)
    y_prob = lgbm.predict_proba(X_test)[:, 1]
    
    # 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)
    roc_auc = roc_auc_score(y_test, y_prob)
    
    print(f"LightGBM模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
    
    4.3 模型评估与比较

    为了判断模型的性能,我们使用以下常见的评估指标:

  • 准确率(Accuracy):正确预测的比例。
  • F1 分数:综合了精确率和召回率,适合处理类别不平衡问题。
  • AUC-ROC:用于评估模型在不同阈值下的表现,越接近 1 越好。

5. 模型优化与调参

在初步训练和评估模型之后,通常需要对模型进行进一步优化,以提升其性能。模型优化主要包括超参数调优和特征选择两个方面。

5.1 超参数调优

每种模型都有许多可调节的超参数,这些参数对模型的表现有重要影响。超参数调优的目标是找到最优的超参数组合,以提高模型的性能。

超参数调优的方法
  • 网格搜索(Grid Search):通过穷举所有可能的超参数组合,找到最佳参数。
  • 随机搜索(Random Search):从超参数空间中随机选择组合进行尝试,比网格搜索更高效。
  • 贝叶斯优化(Bayesian Optimization):利用概率模型来选择超参数组合,以更智能的方式进行优化。

下面是使用网格搜索调优超参数的示例:

# 随机森林超参数调优
param_grid_rf = {
    'n_estimators': [100, 200, 300],
    'max_depth': [10, 20, 30],
    'min_samples_split': [2, 5, 10]
}
grid_search_rf = GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=param_grid_rf, cv=5, verbose=3, scoring='roc_auc', n_jobs=-1)
grid_search_rf.fit(X_train, y_train)
best_rf = grid_search_rf.best_estimator_
# 预测
y_pred = best_rf.predict(X_test)
y_prob = best_rf.predict_proba(X_test)[:, 1]

# 模型评估
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_prob)
print(f"随机森林模型(超参数调优) - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")



from sklearn.model_selection import GridSearchCV

# 随机森林超参数调优
param_grid_rf = {
    'n_estimators': [100, 200, 300],
    'max_depth': [10, 20, 30],
    'min_samples_split': [2, 5, 10]
}
grid_search_rf = GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=param_grid_rf, cv=5, verbose=3, scoring='roc_auc', n_jobs=-1)
grid_search_rf.fit(X_train, y_train)
best_rf = grid_search_rf.best_estimator_

# XGBoost超参数调优
param_grid_xgb = {
    'n_estimators': [100, 200, 300],
    'max_depth': [3, 5, 7],
    'learning_rate': [0.01, 0.1, 0.2],
    'subsample': [0.8, 0.9, 1.0]
}
grid_search_xgb = GridSearchCV(estimator=XGBClassifier(eval_metric='logloss', use_label_encoder=False, random_state=42), param_grid=param_grid_xgb, cv=5, verbose=3, scoring='roc_auc', n_jobs=-1)
grid_search_xgb.fit(X_train, y_train)
best_xgb = grid_search_xgb.best_estimator_

# LightGBM超参数调优
param_grid_lgbm = {
    'n_estimators': [100, 200, 300],
    'max_depth': [3, 5, 7],
    'learning_rate': [0.01, 0.1, 0.2],
    'num_leaves': [31, 63, 127]
}
grid_search_lgbm = GridSearchCV(estimator=LGBMClassifier(random_state=42), param_grid=param_grid_lgbm, cv=5, verbose=3, scoring='roc_auc', n_jobs=-1)
grid_search_lgbm.fit(X_train, y_train)
best_lgbm = grid_search_lgbm.best_estimator_

随机森林模型(超参数调优) - 准确率: 0.8492, F1分数: 0.8138, AUC-ROC: 0.9063 【未调优前:随机森林模型 - 准确率: 0.8380, F1分数: 0.8079, AUC-ROC: 0.8993】

5.2 特征选择

特征选择旨在选择对模型有用的特征,去除冗余或无关的特征,以提高模型的性能和训练效率。

常用的特征选择方法
  • 基于模型的特征选择:使用模型的重要性评分来选择特征。例如,随机森林和梯度提升树模型提供特征重要性评分。
  • 递归特征消除(RFE):递归地训练模型,逐步去除不重要的特征,直到找到最佳特征子集。
  • 特征选择技术:如卡方检验、信息增益等。​​​​​​​​​​​​​​
  • from sklearn.feature_selection import RFE
    
    # 使用随机森林进行特征选择
    selector = RFE(estimator=RandomForestClassifier(n_estimators=100, random_state=42), n_features_to_select=10, step=1)
    selector = selector.fit(X_train, y_train)
    
    # 查看选择的特征
    selected_features = X_train.columns[selector.support_]
    print("选择的特征:", selected_features)
    
5.3 模型集成

集成学习方法将多个模型的预测结果结合起来,以提高最终预测的准确性。常见的集成方法包括

  • 投票法(Voting):将不同模型的预测结果进行投票,得到最终预测。
  • 堆叠(Stacking):将多个模型的预测结果作为特征,输入到另一个模型中进行训练。
    from sklearn.ensemble import VotingClassifier
    
    # 创建集成模型
    voting_clf = VotingClassifier(estimators=[
        ('rf', best_rf),
        ('xgb', best_xgb),
        ('lgbm', best_lgbm)
    ], voting='soft')
    
    # 训练集成模型
    voting_clf.fit(X_train, y_train)
    
    # 预测
    y_pred = voting_clf.predict(X_test)
    y_prob = voting_clf.predict_proba(X_test)[:, 1]
    
    # 模型评估
    accuracy = accuracy_score(y_test, y_pred)
    f1 = f1_score(y_test, y_pred)
    roc_auc = roc_auc_score(y_test, y_prob)
    
    print(f"集成模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
    

6. 结论与展望 

在本篇博客中,我们详细介绍了从数据预处理到模型训练与优化的整个流程。我们使用了多种机器学习模型(逻辑回归、随机森林、XGBoost 和 LightGBM),并对这些模型进行了评估。通过对超参数的调优和特征选择,我们进一步提升了模型的性能。

本文运行源码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score, roc_auc_score
from sklearn.ensemble import RandomForestClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from sklearn.model_selection import GridSearchCV
# 读取数据
data = pd.read_csv('train.csv')

# # 查看数据前几行
# print(data.head())
#
# # 检查数据的总体信息,缺失值和数据类型
# print(data.info())

# # 查看每个特征的基本统计信息
# print(data.describe())
# 填充 Age 缺失值,按 Pclass 的中位数年龄填充
data['Age'] = data.groupby('Pclass')['Age'].transform(lambda x: x.fillna(x.median()))

# 填充 Embarked 缺失值,使用出现频率最高的值
data['Embarked'].fillna(data['Embarked'].mode()[0], inplace=True)

# 删除 Cabin 列,因其缺失值过多
data.drop(columns=['Cabin'], inplace=True)

# 独热编码处理 Sex 和 Embarked 特征
data = pd.get_dummies(data, columns=['Sex', 'Embarked'], drop_first=True)

# 创建 FamilySize 特征
data['FamilySize'] = data['SibSp'] + data['Parch'] + 1

# 创建 IsAlone 特征
data['IsAlone'] = (data['FamilySize'] == 1).astype(int)

# 从姓名中提取称谓(Title),并简化为常见的类别
data['Title'] = data['Name'].str.extract(r' ([A-Za-z]+)\.', expand=False)
data['Title'] = data['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
data['Title'] = data['Title'].replace('Mlle', 'Miss')
data['Title'] = data['Title'].replace('Ms', 'Miss')
data['Title'] = data['Title'].replace('Mme', 'Mrs')

# 独热编码处理 Title 特征
data = pd.get_dummies(data, columns=['Title'], drop_first=True)

# 删除无关特征
data.drop(columns=['PassengerId', 'Name', 'Ticket'], inplace=True)

# 检查数据类型
print(data.dtypes)



# 特征和目标变量
X = data.drop('Survived', axis=1)  # 特征
y = data['Survived']  # 目标变量

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)



# 初始化并训练模型
logreg = LogisticRegression(max_iter=500)
logreg.fit(X_train, y_train)

# 预测
y_pred = logreg.predict(X_test)
y_prob = logreg.predict_proba(X_test)[:, 1]

# 模型评估
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_prob)

print(f"逻辑回归模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")

# from sklearn.ensemble import RandomForestClassifier
#
# # 初始化并训练模型
# rf = RandomForestClassifier(n_estimators=100, random_state=42)
# rf.fit(X_train, y_train)
#
# # 预测
# y_pred = rf.predict(X_test)
# y_prob = rf.predict_proba(X_test)[:, 1]
#
# # 模型评估
# accuracy = accuracy_score(y_test, y_pred)
# f1 = f1_score(y_test, y_pred)
# roc_auc = roc_auc_score(y_test, y_prob)
#
# print(f"随机森林模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
#
#
# from xgboost import XGBClassifier
#
# # 初始化并训练模型
# xgb = XGBClassifier(eval_metric='logloss', use_label_encoder=False, random_state=42)
# xgb.fit(X_train, y_train)
#
# # 预测
# y_pred = xgb.predict(X_test)
# y_prob = xgb.predict_proba(X_test)[:, 1]
#
# # 模型评估
# accuracy = accuracy_score(y_test, y_pred)
# f1 = f1_score(y_test, y_pred)
# roc_auc = roc_auc_score(y_test, y_prob)
#
# print(f"XGBoost模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")
#
#
# from lightgbm import LGBMClassifier
#
# # 初始化并训练模型
# lgbm = LGBMClassifier(random_state=42)
# lgbm.fit(X_train, y_train)
#
# # 预测
# y_pred = lgbm.predict(X_test)
# y_prob = lgbm.predict_proba(X_test)[:, 1]
#
# # 模型评估
# accuracy = accuracy_score(y_test, y_pred)
# f1 = f1_score(y_test, y_pred)
# roc_auc = roc_auc_score(y_test, y_prob)
#
# print(f"LightGBM模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")




# 随机森林超参数调优
param_grid_rf = {
    'n_estimators': [100, 200, 300],
    'max_depth': [10, 20, 30],
    'min_samples_split': [2, 5, 10]
}
grid_search_rf = GridSearchCV(estimator=RandomForestClassifier(random_state=42), param_grid=param_grid_rf, cv=5 ,scoring='roc_auc', n_jobs=-1)
grid_search_rf.fit(X_train, y_train)
best_rf = grid_search_rf.best_estimator_
# 预测
y_pred = best_rf.predict(X_test)
y_prob = best_rf.predict_proba(X_test)[:, 1]

# 模型评估
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_prob)
print(f"随机森林模型(超参数调优) - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")

# XGBoost超参数调优
param_grid_xgb = {
    'n_estimators': [100, 200, 300],
    'max_depth': [3, 5, 7],
    'learning_rate': [0.01, 0.1, 0.2],
    'subsample': [0.8, 0.9, 1.0]
}
grid_search_xgb = GridSearchCV(estimator=XGBClassifier(eval_metric='logloss', use_label_encoder=False, random_state=42), param_grid=param_grid_xgb, cv=5,  scoring='roc_auc', n_jobs=-1)
grid_search_xgb.fit(X_train, y_train)
best_xgb = grid_search_xgb.best_estimator_

# LightGBM超参数调优
param_grid_lgbm = {
    'n_estimators': [100, 200, 300],
    'max_depth': [3, 5, 7],
    'learning_rate': [0.01, 0.1, 0.2],
    'num_leaves': [31, 63, 127]
}
grid_search_lgbm = GridSearchCV(estimator=LGBMClassifier(random_state=42), param_grid=param_grid_lgbm, cv=5,  scoring='roc_auc', n_jobs=-1)
grid_search_lgbm.fit(X_train, y_train)
best_lgbm = grid_search_lgbm.best_estimator_


from sklearn.feature_selection import RFE

# 使用随机森林进行特征选择
selector = RFE(estimator=RandomForestClassifier(n_estimators=100, random_state=42), n_features_to_select=10, step=1)
selector = selector.fit(X_train, y_train)

# 查看选择的特征
selected_features = X_train.columns[selector.support_]
print("选择的特征:", selected_features)

from sklearn.ensemble import VotingClassifier

# 创建集成模型
voting_clf = VotingClassifier(estimators=[
    ('rf', best_rf),
    ('xgb', best_xgb),
    ('lgbm', best_lgbm)
], voting='soft')

# 训练集成模型
voting_clf.fit(X_train, y_train)

# 预测
y_pred = voting_clf.predict(X_test)
y_prob = voting_clf.predict_proba(X_test)[:, 1]

# 模型评估
accuracy = accuracy_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
roc_auc = roc_auc_score(y_test, y_prob)

print(f"集成模型 - 准确率: {accuracy:.4f}, F1分数: {f1:.4f}, AUC-ROC: {roc_auc:.4f}")


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL笔记--多表查询

1--多表关系 多表关系基本上分为三种: 一对多(多对一); 多对多; 一对一; 1-1--多对一 在多的一方建立外键,指向一的一方的主键; 1-2--多对多 建立第三张中间表,中间表至少…

利用git上传项目到GitHub

GitHub是基于git实现的代码托管。git是目前最好用的版本控制系统了,非常受欢迎,比之svn更好。 GitHub可以免费使用,并且快速稳定。 利用GitHub,你可以将项目存档,与其他人分享交流,并让其他开发者帮助你一…

Gate学习(7)引入体素源

一、从GitHub下载体素源模型源码 下载地址:BenAuer2021/Phantoms-for-Nuclear-Medicine-Imaging-Simulation:用于核医学成像应用的模型(闪烁显像、SPECT 和 PET) --- BenAuer2021/Phantoms-For-Nuclear-Medicine-Imaging-Simulat…

快速启动Go-Admin(Gin + Vue3 + Element UI)脚手架管理系统

Go-Admin 是一个基于 Gin Vue Element UI & Arco Design & Ant Design 的前后端分离权限管理系统脚手架。它包含了多租户支持、基础用户管理功能、JWT 鉴权、代码生成器、RBAC 资源控制、表单构建、定时任务等功能。该项目的主要编程语言是 Go 和 JavaScript。 ps&a…

epoll反应堆模型

epoll反应堆模型 基于该视频所做笔记,视频里面讲的也挺难的,最好先让chat给你梳理一遍整体的代码再去看视频吧 15-epoll反应堆模型总述_bilibili_哔哩哔哩_bilibili 文章目录 epoll反应堆模型1.epoll反应堆模型概述2.具体讲解1.myevent_s结构体2.超时检…

F-Cooper论文精读(未完成)

F-Cooper 文章目录 背景有关边缘计算基于单目激光雷达数据的3D目标检测 创新点与以前比创新之处1:引入基于特征的协同感知(F-Cooper)框架创新2:所需数据量减少 2. 基于特征融合的车辆数据处理2.1 卷积特征图2.2 融合特征2.2.1 融…

Z240004基于Java+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化,包括新增了注册功能,房屋模糊查询功能,管理员和用户信息管理等功能,以及对网站界面进行了优…

嵌入式软考学习笔记(1)超详细!!!

目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与:有0则0,全1才1 或:有1则1,全0才0 异或:相同为0…

C# 探险之旅:第二十五节 - 类型class之字段Fields大冒险

嘿,探险家们!欢迎再次搭乘C#的魔法列车,今天我们要深入探索class里的宝藏——字段(Fields)!想象一下,字段就像是类里的秘密小房间,里面藏着对象的小秘密和宝藏。我们不仅要看看这些小…

时序论文31|NIPS24自注意力机制真的对时序预测任务有效吗?

论文标题:Are Self-Attentions Effective for Time Series Forecasting? 论文链接:https://arxiv.org/pdf/2409.18696 代码链接:https://github.com/dongbeank/CATS 前言 本文将重点转向探究自注意力机制在其中的有效性,提出…

Linux中openEuler 系统 配置mail.rc给邮箱发送邮件

这里用这个实验判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查一次磁盘剩余空间。 查看当前磁盘剩余空间[rootserver ~]# df -h | grep "\/$" | cut -d" " -f4 | cut -d"G" -…

【51单片机】矩阵按键快速上手

51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式,特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍: 一、矩阵按键的基本概念 ‌定义‌:矩阵按键,又称行列键盘,是…

clearvoice 语音降噪、语音分离库

参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main ClearVoice 提供了一个统一的推理平台,用于语音增强、语音分离以及视听目标说话人提取。 代码参看: https://github.com/modelscope/ClearerVoice-Studio/tree/main/clearvoice https://github.com/mode…

外观模式的理解和实践

外观模式(Facade Pattern)是一种常用的软件设计模式,它提供了一个统一的接口,用来访问子系统中的一群接口。该模式定义了一个高层的接口,使得子系统更容易使用。简单来说,外观模式就是通过引入一个外观角色…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…

Type-C接口电热毯的创新之旅

在科技日新月异的今天,智能家居产品正逐步渗透到我们生活的每一个角落,从智能灯光到温控系统,无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中,一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

【从零开始入门unity游戏开发之——C#篇09】if-else条件表达式、三元运算符、switch-case的使用

文章目录 一、if条件表达式1、if 语句基本结构示例输出: 2、else语句示例输出: 3、else if 语句示例输出: 4、组合逻辑运算符示例输出: 5、嵌套 if 语句示例输出:总结 二、三元运算符1、语法:2、示例&#…

CIFAR10 数据集介绍并转化为图片

CIFAR10数据集 CIFAR-10数据集是一个广泛使用的机器学习数据集,它包含10个类别的 60000 张32x32的彩色图像。每个类别有6000张图像,其中50000张用于训练,1000 张用于测试。这些类别包括: 飞机(airplane)汽车…

我们需要什么样的运维:以业务目标为导向的运维体系建设

在数字化转型的浪潮中,运维作为信息技术基础设施的重要支撑,其重要性日益凸显。然而,传统的运维模式往往局限于网络稳定、设备监控和系统可用等基础目标,难以满足现代企业对业务支持的更高要求。那么,我们究竟需要什么…

12.5【计算机网络】【Study】

如果使用 LACP 协议,设备之间会通过发送 LACP 数据包进行协商,确保双方都支持链路聚合,并且配置一致。LACP 会自动检测和管理链路的状态,确保只有活动的链路参与聚合。 负载均衡:链路聚合组中的多个物理链路可以同时传…