知识点复习
- 不平衡数据集的处理:过采样、修改权重、修改阈值
- 交叉验证代码
作业:
从示例代码可以看到 效果没有变好,所以很多步骤都是理想是好的,但是现实并不一定可以变好。这个实验仍然有改进空间,如下。
1. 我还没做smote+过采样+修改权重的组合策略,有可能一起做会变好。
2. 我还没有调参,有可能调参后再取上述策略可能会变好
1. 结合SMOTE、Random OverSampling和修改类别权重
from imblearn.over_sampling import SMOTE, RandomOverSampler
# 假设X_train, y_train为训练集
# 1. 使用SMOTE生成合成样本
smote = SMOTE(sampling_strategy='auto', k_neighbors=5, random_state=42)
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)
# 2. 再用随机过采样做平衡(可选,根据效果调整)
ros = RandomOverSampler(sampling_strategy='auto', random_state=42)
X_final, y_final = ros.fit_resample(X_resampled, y_resampled)
# 3. 使用类别权重(以样本为权重或模型参数)
# 例如:在XGBoost中设置scale_pos_weight=(负样本数/正样本数)
model = xgb.XGBClassifier(
scale_pos_weight=class_weight_ratio, # 可以根据样本数比调整
n_estimators=100,
max_depth=6,
learning_rate=0.1,
random_state=42
)
model.fit(X_final, y_final)
2.调参
from sklearn.model_selection import GridSearchCV
param_grid = {
'max_depth': [4, 6, 8],
'learning_rate': [0.01, 0.1],
'n_estimators': [50, 100, 150],
'scale_pos_weight': [1, 5, 10] # 根据样本比例调节
}
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, scoring='f1', cv=5)
grid_search.fit(X_train, y_train)
print(grid_search.best_params_)