You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

机器学习中如何处理重叠数据?Bot检测模型性能优化求助

Bot检测模型表现接近随机猜测的原因分析

我正在开发一个用于判断用户是否为Bot的机器学习模型,使用seaborn绘制pairplot后发现大部分数据存在重叠。4万余样本下模型近乎靠猜测输出结果,以下是问题排查和解决方案:

数据集样本示例

5 Samples from the dataset

当前代码存在的核心问题

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))

模型表现

模型在4万余样本下的表现

问题根源分析

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:47:16