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

文章详细介绍了在预测Santander银行客户满意度任务中进行的特征工程步骤,包括新特征提取(如计算零值和非零值出现次数)、过滤冗余特征(删除与目标变量相关性低和高相关性的特征)以及数据预处理(如对数变换、独热编码和响应编码)。通过对分类特征进行编码和对数值特征进行对数变换,优化了数据集,为后续的模型训练做好准备。

特征工程

1、新特征提取

我们读取一下之前保存的pickle文件并打印出此时的train和test,前面的探索性分析过程我们保留了143个特征,接下来我们还希望在这些特征中提取出一些隐藏的信息。

train = pd.read_pickle('./data/santander-customer-satisfaction/output/train.pkl')
test = pd.read_pickle('./data/santander-customer-satisfaction/output/test.pkl')
X_train = train.copy()
X_test = test.copy()
X_train.shape,X_test.shape
((76020, 144), (75818, 143))

在EDA过程中我们知道了训练集中包含了非常多的0值,那么我们是否可以构造一个特征,他表示每行样本中,所有特征值零或非零出现的次数呢?我们将其命名为no_zeros和no_nonzeros

def add_feature_no_zeros(train=X_train,test = X_test):
    #构造新特征,表示每行样本中143个特征取值为0和非零的出现次数
    col = [k for k in train.columns if k != 'TARGET']
    for df in [train,test]:
        df['no_zeros'] = (df.loc[:,col] != 0).sum(axis=1).values
        df['no_nonzeros'] = (df.loc[:,col] == 0).sum(axis=1).values

除此之外,在样本的所有特征中,每一种前缀的特征都有其独特的分布规律,每行记录每种关键词的所有特征取值为零的个数。因此我们构造新特征,表示每一行样本中每一种关键词前缀的特征取值为零或者非零的出现次数。

def add_feature_no_zeros_keyword(keyword,train=X_train,test=X_test):
    col = [k for k in train.columns if keyword in k]
    # for k in col:
    for df in [train,test]:
        df['no_zeros_'+keyword] = (df.loc[:,col] != 0).sum(axis=1).values
        df['no_nonzeros_'+keyword] = (df.loc[:,col] == 0).sum(axis=1).values
add_feature_no_zeros()
keywords = list(f_keywords.keys())
for k in keywords:
    add_feature_no_zeros_keyword(k)

此时我们再来查看一下训练集和测试集的shape:

X_train.shape,X_test.shape
((76020, 154), (75818, 153))

这样就新增了10个特征

除此之外,我们注意到imp和saldo前缀特征,他们的取值除了0以外,其他的值是一个右偏分布,而且分布比较零散,那么我们将其均值作为一个新特征。
考虑到一个均值对目标变量应该没有影响,构造新特征-获取唯一值个数处于(50,210]之间的’col’特征中取每一种唯一值的情况下,含imp和saldo前缀特征的均值

def average_col(col,features,train=X_train,test=X_test):
    '''
    获取'col'特征中每一种唯一值的情况下feature特征的均值,并令其为新特征
    '''
    for df in [train,test]:
        unique_values = df[col].unique()

        for feature in features:
            #对每一个特征求他在指定特征col的每一个唯一值下的均值
            avg_value = []
            for value in unique_values:
                #对于每一个特征列col,求其每一种唯一值的情况下feature特征的均值
                avg = df.loc[df[col] == value,feature].mean()
                avg_value.append(avg)
            avg_dict = dict(zip(unique_values,avg_value))
            new_col = 'avg_'+ col + '_' + feature

            df[new_col] = np.zeros(df.shape[0])#新建新特征
            for value in unique_values:
                df.loc[df[col]==value,new_col] = avg_dict[value]
#含imp和saldo前缀的所有特征,不包括no_zeros_imp和no_zeros_saldo
features = [i for i in X_train.columns if (('imp' in i) | ('saldo' in i)) & ('no_zeros' not in i)]

#唯一值个数处于(50,210]之间的特征列
columns = [i for i in X_train.columns if (X_train[i].nunique
### 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) ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值