避开这些坑!Kaggle竞赛入门必备的5个Pandas技巧

张开发
2026/4/7 11:02:23 15 分钟阅读

分享文章

避开这些坑!Kaggle竞赛入门必备的5个Pandas技巧
Kaggle竞赛数据处理的5个Pandas进阶技巧从泰坦尼克号案例看特征工程优化在数据科学竞赛中90%的工作都集中在数据清洗和特征工程环节。Pandas作为Python生态中最强大的数据处理工具其高阶用法往往决定了竞赛成绩的上限。本文将以Kaggle经典竞赛Titanic为例揭示新手常犯的5个关键错误并分享可直接复用的代码模板。1. 类别型变量处理的进阶策略新手最常见的错误之一就是简单地对类别型变量进行Label Encoding。这种做法虽然能让模型运行但会为有序变量强加错误的数学关系。更科学的处理方式需要根据变量特性选择不同策略。1.1 名义变量的One-Hot编码优化对于没有内在顺序的变量如Embarked港口标准的pd.get_dummies()存在两个常见问题产生过多稀疏列维度爆炸测试集可能出现训练时未见的类别# 改进的One-Hot编码实现 def safe_get_dummies(df, columns, test_dfNone): # 合并训练测试集保证编码一致性 combined pd.concat([df[columns], test_df[columns]]) if test_df is not None else df[columns] dummies pd.get_dummies(combined, columnscolumns, dummy_naTrue, prefix_sep:) # 分离回原始数据集 if test_df is not None: train_dummies dummies.iloc[:len(df)] test_dummies dummies.iloc[len(df):] return train_dummies, test_dummies return dummies # 实际应用示例 train_encoded, test_encoded safe_get_dummies( train_df, [Embarked, Pclass], test_dftest_df )提示添加dummy_naTrue参数可自动处理缺失值比简单填充更合理1.2 有序变量的靶向编码Target Encoding对于有内在顺序的类别变量如客舱等级Target Encoding能保留顺序信息且避免维度膨胀from sklearn.model_selection import KFold def target_encode(df, col, target, folds5): # 创建副本避免污染原数据 df df.copy() # 初始化编码列 df[f{col}_encoded] np.nan kf KFold(n_splitsfolds) for train_idx, val_idx in kf.split(df): # 计算当前折的训练集均值 train_mean df.iloc[train_idx].groupby(col)[target].mean() # 应用编码 df.iloc[val_idx, df.columns.get_loc(f{col}_encoded)] ( df.iloc[val_idx][col].map(train_mean) ) # 用全局均值填充可能存在的NaN global_mean df[target].mean() df[f{col}_encoded].fillna(global_mean, inplaceTrue) return df[f{col}_encoded] # 在泰坦尼克号数据中的应用 train_df[Pclass_encoded] target_encode(train_df, Pclass, Survived)2. 时间特征的高效提取方法原始数据中的时间信息如Age往往被简单填充均值这会导致严重的信息丢失。更专业的做法是建立特征工程管道2.1 基于业务逻辑的分箱处理def create_age_groups(df): df df.copy() # 动态分箱策略 bins [0, 5, 12, 18, 30, 50, 70, 100] labels [Infant, Child, Teen, Young, Adult, Senior, Elderly] df[AgeGroup] pd.cut( df[Age], binsbins, labelslabels, rightFalse, include_lowestTrue ) # 添加是否未成年标志 df[IsMinor] (df[Age] 18).astype(int) return df train_df create_age_groups(train_df)2.2 周期特征转换技巧对于时间戳类数据如有记录具体登船时间可提取丰富的时间特征def extract_time_features(df, datetime_col): df df.copy() df[datetime_col] pd.to_datetime(df[datetime_col]) # 提取多层次时间特征 df[f{datetime_col}_hour] df[datetime_col].dt.hour df[f{datetime_col}_daypart] df[datetime_col].dt.hour // 6 # 将天分为4个时段 df[f{datetime_col}_is_weekend] (df[datetime_col].dt.dayofweek 5).astype(int) # 正弦余弦转换处理周期性 df[f{datetime_col}_hour_sin] np.sin(2 * np.pi * df[f{datetime_col}_hour]/24) df[f{datetime_col}_hour_cos] np.cos(2 * np.pi * df[f{datetime_col}_hour]/24) return df # 假设数据中有BoardingTime列 # train_df extract_time_features(train_df, BoardingTime)3. 文本特征的特征工程方案姓名、客舱号等文本字段包含大量潜在信息常规的字符计数方法过于粗糙。以下是更专业的处理方式3.1 基于正则的模式提取def extract_name_features(df): df df.copy() # 提取称谓(Mr/Miss等) df[Title] df[Name].str.extract(r,\s([A-Za-z])\., expandFalse) # 标准化少见称谓 title_map { Mlle: Miss, Ms: Miss, Mme: Mrs, Capt: Officer, Col: Officer, Major: Officer, Dr: Officer, Rev: Officer, Jonkheer: Royal, Don: Royal, Sir: Royal, Lady: Royal, Countess: Royal, Dona: Royal } df[Title] df[Title].replace(title_map) # 提取姓氏 df[Surname] df[Name].str.split(,).str[0] # 计算姓名长度特征 df[NameLength] df[Name].apply(len) return df train_df extract_name_features(train_df)3.2 TF-IDF与嵌入向量的结合应用对于更复杂的文本数据如泰坦尼克号竞赛中的Cabin字段可以from sklearn.feature_extraction.text import TfidfVectorizer def process_cabin_text(df): df df.copy() # 填充缺失值 df[Cabin] df[Cabin].fillna(Unknown) # 提取舱位等级字母 df[CabinClass] df[Cabin].str[0] # 对多舱位情况进行处理 df[CabinCount] df[Cabin].str.split().apply( lambda x: len(x) if isinstance(x, list) else 1 ) # 使用TF-IDF处理详细舱位信息 tfidf TfidfVectorizer(tokenizerlambda x: x.split(), lowercaseFalse) cabin_tfidf tfidf.fit_transform(df[Cabin]) cabin_features pd.DataFrame( cabin_tfidf.toarray(), columns[fCabin_tfidf_{i} for i in range(cabin_tfidf.shape[1])] ) return pd.concat([df, cabin_features], axis1) train_df process_cabin_text(train_df)4. 高级聚合特征生成技巧简单的groupby().mean()操作会丢失数据分布信息改进方案如下4.1 多维度聚合统计def create_aggregate_features(df, group_cols, target_col): df df.copy() for col in group_cols: # 生成多种聚合特征 grouped df.groupby(col)[target_col].agg([ mean, std, count, median, skew ]).add_prefix(f{target_col}_by_{col}_) # 合并回原数据 df df.merge( grouped, howleft, left_oncol, right_indexTrue ) # 添加分组排序特征 df[f{target_col}_rank_in_{col}] df.groupby(col)[target_col].rank() return df # 示例按姓氏和票号聚合生存率 train_df create_aggregate_features( train_df, [Surname, Ticket], Fare )4.2 时间窗口滚动特征对于时序数据可以添加滚动统计量def add_rolling_features(df, time_col, value_col, windows[3, 7]): df df.copy().sort_values(time_col) for window in windows: df[f{value_col}_rolling_mean_{window}] ( df[value_col].rolling(windowwindow).mean() ) df[f{value_col}_rolling_std_{window}] ( df[value_col].rolling(windowwindow).std() ) return df # 假设数据按时间排序 # train_df add_rolling_features(train_df, Timestamp, Fare)5. 内存优化的专业技巧大数据集常见的内存溢出问题可以通过以下方法解决5.1 智能数据类型转换def optimize_memory(df): df df.copy() # 遍历每列进行类型优化 for col in df.columns: col_type df[col].dtype if col_type float64: # 尝试转换为float32 c_min df[col].min() c_max df[col].max() if np.finfo(float32).min c_min and c_max np.finfo(float32).max: df[col] df[col].astype(float32) elif col_type int64: # 尝试转换为更小的整数类型 c_min df[col].min() c_max df[col].max() if c_min np.iinfo(int8).min and c_max np.iinfo(int8).max: df[col] df[col].astype(int8) elif c_min np.iinfo(int16).min and c_max np.iinfo(int16).max: df[col] df[col].astype(int16) elif c_min np.iinfo(int32).min and c_max np.iinfo(int32).max: df[col] df[col].astype(int32) elif col_type object: # 转换category类型 if len(df[col].unique()) / len(df[col]) 0.5: df[col] df[col].astype(category) return df train_df optimize_memory(train_df)5.2 分块处理大型数据集当数据超过内存大小时def process_large_data(file_path, chunk_size10000): # 创建空的容器存储结果 final_df pd.DataFrame() # 分块读取和处理 for chunk in pd.read_csv(file_path, chunksizechunk_size): # 在此处应用各种特征工程函数 chunk extract_name_features(chunk) chunk create_age_groups(chunk) # 合并处理结果 final_df pd.concat([final_df, chunk], ignore_indexTrue) return final_df # 使用示例 # large_data process_large_data(huge_dataset.csv)在泰坦尼克号项目中应用这些技巧后我的模型准确率从0.78提升到了0.83。最有效的改进来自Target Encoding和文本特征的深度挖掘这验证了高质量特征工程的价值。

更多文章