首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能的数据泄露或过度拟合?

可能的数据泄露或过度拟合?
EN

Stack Overflow用户
提问于 2020-07-14 03:07:22
回答 3查看 72关注 0票数 0

我正在研究一个多类分类问题。数据的格式为

代码语言:javascript
复制
Feature1 Feature2 Feature3  Features4 feature5 features features Class
 0.1       0.2      0.3       1         0.2      0.9       0.5   Apple
 0.3       0.1      0.4        0.2     0.2       1.1       1.9    Orange
 0.12       0.22    0.13       1.4     1.5       1.9       1      Banana
 0.112      0.231   0.3        8        4         4        2      Watermelon

我的数据集有7个特征和42000行。其中约22000属于苹果类别,其余的平均分配给其他类别。现在我已经使用随机森林分类器进行了拟合。

EN

回答 3

Stack Overflow用户

发布于 2020-07-14 03:16:54

尝试可视化,看看是否有任何重要的功能。探索数据总是有帮助或有用的。尝尝这个

代码语言:javascript
复制
feature_importance = classifier.feature_importances_
feature_importance = 100.0 * (feature_importance / feature_importance.max())
sorted_idx = np.argsort(feature_importance)
pos = np.arange(sorted_idx.shape[0]) + .5

plt.figure(figsize=(12,6))
plt.barh(pos, feature_importance[sorted_idx], align='center')
plt.yticks(pos, X_train.columns[sorted_idx]) #X_train is your training dataset
plt.xlabel('Relative Importance')
plt.title('Variable Importance')
plt.show()
票数 0
EN

Stack Overflow用户

发布于 2020-07-14 03:51:21

理想情况下,您应该保持测试数据的完整性-仅对您的训练数据进行过采样:因此,删除行X_test,y_test = oversample.fit_resample(X_test,y_test)

此外,您在这里打印训练数据的分数:print(np.mean(cross_val_score(classifier, X_train, y_train, cv=10))) -当您尝试打印测试数据的分数时会发生什么?

此外,您可能应该将min_samples_leaf从1增加到更高的值-1意味着您允许拆分,即使那里只有数据点-这肯定可以帮助您过拟合。

票数 0
EN

Stack Overflow用户

发布于 2020-07-14 04:34:17

有几个方面是错误的。

X_train,y_train = oversample.fit_resample(X_train,y_train)

在交叉验证之前,您不能这样做。您正在使用验证集中的信息对训练集进行过采样。

X_train = scaler.fit_transform(X_train)

您不能缩放整个数据集,然后运行交叉验证。您正在使用将进入(CV的每一轮)验证集的样本来估计均值和sd。这是不正确的。

实现它的一种方法是:

代码语言:javascript
复制
kf = KFold(n_splits=10)
acc = np.zeros(10)
k=0
for train_index, test_index in kf.split(X_train):

  X_tr = X_train[train_index, :]
  y_tr = y_train[train_index]

  X_te = X_test[test_index, :]
  y_te = y_train[test_index]

  scaler = StandardScaler()
  X_tr = scaler.fit_transform(X_tr)
  X_te = scaler.transform(X_te)
  
  oversample = SMOTE()
  X_tr,y_tr = oversample.fit_resample(X_tr,y_tr)
    
  classifier = RandomForestClassifier(
    n_estimators=100,
    criterion='gini',
    max_depth=22,
    min_samples_split=2,
    min_samples_leaf=1,
    min_weight_fraction_leaf=0.0,
    max_features='auto',
    max_leaf_nodes=None,
    min_impurity_decrease=0.0,
    min_impurity_split=None,
    bootstrap=True,
    oob_score=False,
    n_jobs=-1,
    random_state=0,
    verbose=0,
    warm_start=False,
    class_weight='balanced'
  )

  classifier.fit(X_tr, y_tr)
  y_pr = classifier.predict(X_te)

  acc[k] = np.sum(y_te == y_pr) / len(y_te)
  k+=1

np.mean(acc)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62882631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档