Kaggle竞赛——桑坦德银行客户满意度预测(四)

文章详细介绍了使用逻辑回归、决策树、随机森林和XGBoost、LightGBM等模型对桑坦德银行客户满意度进行预测的过程,包括数据读取、AUC函数定义、模型调参、概率校准以及模型性能评估。重点讨论了概率校准的重要性,并展示了不同模型的ROC曲线和性能指标,其中LightGBM模型在AUC上表现最佳。

模型训练与评估

读取数据

#加载数据集
dataset = 'Normal'
train = pd.read_pickle('./data/santander-customer-satisfaction/output/train_normal.pkl')
test = pd.read_pickle('./data/santander-customer-satisfaction/output/test_normal.pkl')
X_train = train.drop(['ID','TARGET'],axis=1)
y_train = train['TARGET'].values
X_test = test.drop('ID',axis=1)
test_id = test['ID']

del train,test

#划分数据集
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, stratify=y_train, test_size=0.15)
X_train.shape, X_val.shape, X_test.shape

我们分别输出训练集、验证集、测试集的shape:

((64617, 336), (11403, 336), (75818, 336))

定义AUC函数和调参函数

ROC:接收器工作曲线
AUC(Area Under the Curve):ROC曲线下面积

接下来我们定义ROC曲线绘制函数

global i
i = 0

def plot_auc(y_true,y_pred,label,dataset = dataset):
    '''
    给出y_true和y_pred时绘制ROC曲线
    dataset:告诉我们使用了哪个数据集
    label:告诉我们使用了哪个模型,若label是一个列表,则绘制所有标签的所有ROC曲线
    '''
    if (type(label) != list) & (type(label) != np.array):
        print("\t\t %s on %s dataset \t\t \n" % (label, dataset))
        auc = roc_auc_score(y_true, y_pred)
        logloss = log_loss(y_true, y_pred)  #-(ylog(p) + (1-y)log(1-p)))
        label_1 = label + ' AUC=%.3f' % (auc)

        # 绘制ROC曲线
        fpr, tpr, threshold = roc_curve(y_true, y_pred)
        sns.lineplot(fpr, tpr, label=label_1)
        x = np.arange(0, 1.1, 0.1)  # 绘制AUC=0.5的直线
        sns.lineplot(x, x, label="AUC=0.5")
        plt.title("ROC on %s dataset" % (dataset))
        plt.xlabel('False Positive Rate')
        plt.ylabel("True Positive Rate")
        plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)  # 设置图例在图形外
        plt.show()
        print("在 %s 数据集上 %s 模型的 logloss = %.3f  AUC = %.3f" % (dataset, label, logloss, auc))

        # 创建结果数据框
        result_dict = {
   
   
            "Model": label,
            'Dataset': dataset,
            'log_loss': logloss,
            'AUC': auc
        }
        return pd.DataFrame(result_dict, index=[i])

    else:
        # 绘制ROC曲线
        plt.figure(figsize=(12, 8))
        for k, y in enumerate(y_pred):
            fpr, tpr, threshold = roc_curve(y_true, y)
            auc = roc_auc_score(y_true, y)
            label_ = label[k] + 
### Kaggle Santander Customer Satisfaction 预测赛题的机器学习解决方案 Kaggle Santander Customer Satisfaction 是一项二分类问题,目标是预测银行客户的交易体验是否满意。此竞赛数据具有不平衡性,因此模型优化的目标是最大化 AUC 值(ROC 曲线下面积)。以下是一个完整的解决方案框架: --- #### 1. 数据预处理 数据预处理是构建高质量模型的基础步骤之一。以下是关键步骤: - **特征分析**:检查特征分布、缺失值和异常值[^1]。 - **类别平衡处理**:由于这是一个不平衡分类问题,可以使用 SMOTE 或 ADASYN 等技术生成少数类样本[^4]。 - **特征缩放**:对于某些算法(如逻辑回归或支持向量机),需要对数值型特征进行标准化或归一化。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) ``` --- #### 2. 特征选择与降维 - **特征重要性评估**:通过随机森林等模型计算特征的重要性,筛选出对目标变量影响较大的特征。 - **降维方法**:如果特征维度较高,可以使用主成分分析(PCA)或线性判别分析(LDA)降低维度。 ```python from sklearn.ensemble import RandomForestClassifier from sklearn.feature_selection import SelectFromModel model = RandomForestClassifier() model.fit(X, y) # 根据特征重要性选择子集 sfm = SelectFromModel(model, threshold="mean") X_important = sfm.transform(X) ``` --- #### 3. 模型选择与训练 根据引用内容,不同模型的表现差异较大。以下是几种常用的分类模型及其优缺点: - **RandomForestClassifier**:效果较好且速度较快,适合初步建模[^4]。 - **GradientBoostingClassifier**:性能最优但速度较慢,适用于最终模型优化[^4]。 - **XGBoost/LightGBM/CatBoost**:这些梯度提升框架在处理大规模数据时表现优异,推荐作为主要模型[^2]。 ```python from sklearn.ensemble import GradientBoostingClassifier gb_model = GradientBoostingClassifier() gb_model.fit(X_train, y_train) ``` --- #### 4. 概率校准 概率校准旨在改进模型输出的概率估计质量,使其更接近真实值。这是分类任务中一个重要的后处理步骤[^3]。 - **校准方法**:常用的方法包括 Platt Scaling 和 Isotonic Regression。 - **实现方式**:可以使用 `CalibratedClassifierCV` 对模型进行校准。 ```python from sklearn.calibration import CalibratedClassifierCV calibrated_gb = CalibratedClassifierCV(gb_model, method='sigmoid', cv=5) calibrated_gb.fit(X_train, y_train) ``` --- #### 5. 模型评估与调优 - **评估指标**:由于目标是最大化 AUC,建议使用 ROC 曲线和 AUC 分数作为主要评估标准。 - **超参数调优**:使用网格搜索(Grid Search)或贝叶斯优化(Bayesian Optimization)调整模型参数。 ```python from sklearn.model_selection import GridSearchCV param_grid = { 'n_estimators': [100, 200], 'learning_rate': [0.01, 0.1] } grid_search = GridSearchCV(GradientBoostingClassifier(), param_grid, scoring='roc_auc', cv=5) grid_search.fit(X_train, y_train) ``` --- #### 6. 提交结果 将测试集的预测结果保存为 CSV 文件,并按照竞赛要求格式提交。 ```python import pandas as pd test_predictions = calibrated_gb.predict_proba(X_test)[:, 1] submission = pd.DataFrame({'ID': test_ids, 'TARGET': test_predictions}) submission.to_csv('submission.csv', index=False) ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值