机器学习中如何处理重叠数据?Bot检测模型性能优化求助
Bot检测模型表现接近随机猜测的原因分析
我正在开发一个用于判断用户是否为Bot的机器学习模型,使用seaborn绘制pairplot后发现大部分数据存在重叠。4万余样本下模型近乎靠猜测输出结果,以下是问题排查和解决方案:
数据集样本示例

当前代码存在的核心问题
X = new_df[['Retweet Count', 'Mention Count', 'Follower Count', 'Tweet', 'Hashtags', 'Verified', 'Created At']] y = new_df[['Bot Label']].values y = y.ravel() # Ensuring that y is 1D array instead of a 2D array X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) Scaler = StandardScaler() X_train_scaled = Scaler.fit_transform(X_train) X_test_scaled = Scaler.transform(X_test) from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification from sklearn.metrics import confusion_matrix rfc = RandomForestClassifier(n_estimators = 1000) rfc.fit(X_train_scaled, y_train) y_pred = rfc.predict(X_test_scaled) print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))
模型表现

问题根源分析
1. 特征处理完全错误
- 特征矩阵
X包含非数值型特征:Tweet(文本)、Hashtags(标签类数据)、Created At(日期时间),而StandardScaler仅支持数值型特征缩放。直接对混合特征执行标准化会导致隐性错误(比如无法将文本转换为数值,实际只处理了部分特征),模型无法获取有效信息。 - 随机森林等树模型不需要特征标准化,树模型基于特征分裂决策,对特征尺度不敏感,这一步操作完全多余,甚至会干扰模型学习。
2. 关键特征未做工程化
- 文本特征
Tweet和Hashtags未做任何处理:Bot的推文通常有明显模式(比如重复内容、关键词模板、大量Hashtags),你需要提取文本长度、Hashtag数量、关键词频率等统计特征,或用TF-IDF、Word2Vec将文本转为数值表示。 - 日期特征
Created At未挖掘:Bot账号通常创建时间短,或集中在特定时间段发推,可提取账号创建时长、推文发布时段等特征。
3. 现有特征区分度不足
Pairplot显示数据大量重叠,说明当前使用的数值特征(转发数、提及数、粉丝数、认证状态)在Bot和非Bot群体中分布差异极小,模型找不到有效决策边界。需补充高区分度特征:
- 账号关注数/粉丝数比例(Bot通常粉丝少、关注多)
- 单位时间推文发布频率(Bot发推更频繁)
- 个人简介完整性(Bot简介常为空或重复)
- 是否存在重复推文(Bot易发布相同内容)
4. 可能的类别不平衡问题
如果数据集里Bot和非Bot样本占比极端失衡(比如Bot仅占5%以下),模型会倾向于预测多数类,表现接近随机猜测。可查看y_train的类别分布,若不平衡需用class_weight='balanced'调整模型权重,或用SMOTE等方法生成合成样本。
修正后的代码示例
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import classification_report, confusion_matrix from sklearn.preprocessing import LabelEncoder # 特征工程函数:处理非数值特征并提取新特征 def process_features(df): # 处理日期:计算账号创建天数 df['Created At'] = pd.to_datetime(df['Created At']) df['Account_Age_Days'] = (pd.Timestamp.now() - df['Created At']).dt.days # 文本特征提取:推文长度、Hashtag数量 df['Tweet_Length'] = df['Tweet'].str.len().fillna(0) df['Hashtag_Count'] = df['Hashtags'].apply(lambda x: len(str(x).split(',')) if pd.notna(x) else 0) # 转换布尔特征为数值 le = LabelEncoder() df['Verified'] = le.fit_transform(df['Verified']) # 选择有效特征 final_features = ['Retweet Count', 'Mention Count', 'Follower Count', 'Verified', 'Account_Age_Days', 'Tweet_Length', 'Hashtag_Count'] return df[final_features] # 处理特征 X = process_features(new_df) y = new_df['Bot Label'].values.ravel() # 拆分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练随机森林(加入类权重处理不平衡) rfc = RandomForestClassifier(n_estimators=1000, class_weight='balanced', random_state=42) rfc.fit(X_train, y_train) y_pred = rfc.predict(X_test) # 输出评估结果 print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))
内容的提问来源于stack exchange,提问作者Shane Caesar
相关产品推荐
相关产品推荐

