我正在研究一个多类分类问题。数据的格式为
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属于苹果类别,其余的平均分配给其他类别。现在我已经使用随机森林分类器进行了拟合。
发布于 2020-07-14 03:16:54
尝试可视化,看看是否有任何重要的功能。探索数据总是有帮助或有用的。尝尝这个
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()发布于 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意味着您允许拆分,即使那里只有数据点-这肯定可以帮助您过拟合。
发布于 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。这是不正确的。
实现它的一种方法是:
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)https://stackoverflow.com/questions/62882631
复制相似问题