可能的数据泄漏或过度安装?

2024-09-27 07:18:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个多类分类问题。数据的格式如下所示

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人属于苹果类,其余的人平均分配给其他人。现在我已经适应了使用随机森林分类器


Tags: 数据功能apple格式分类classbananafeatures
3条回答

有几个方面是错误的

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

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

X_train = scaler.fit_transform(X_train)

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

一种实施方法是:

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)

理想情况下,您应保持测试数据完整-仅对列车数据进行抽样: 因此,删除行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意味着您允许拆分,即使那里只有数据点-这肯定会帮助您进行过度拟合

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

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

相关问题 更多 >

    热门问题