为什么 "StratifiedShuffleSplit" 对数据集的每个拆分给出相同的结果?
Why does "StratifiedShuffleSplit" give the same result for every split of dataset?
我正在使用 StratifiedShuffleSplit
重复拆分数据集、拟合、预测和计算指标的过程。你能解释一下为什么每次拆分都给出相同的结果吗?
import csv
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.metrics import classification_report
clf = RandomForestClassifier(max_depth = 5)
df = pd.read_csv("https://raw.githubusercontent.com/leanhdung1994/BigData/main/cll_dataset.csv")
X, y = df.iloc[:, 1:], df.iloc[:, 0]
sss = StratifiedShuffleSplit(n_splits = 5, test_size = 0.25, random_state = 0).split(X, y)
for train_ind, test_ind in sss:
X_train, X_test = X.loc[train_ind], X.loc[test_ind]
y_train, y_test = y.loc[train_ind], y.loc[test_ind]
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
report = classification_report(y_test, y_pred, zero_division = 0, output_dict = True)
report = pd.DataFrame(report).T
report = report[:2]
print(report)
结果是
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
您构建的每个模型都预测输出始终为 class 0,并且由于您进行了分层拆分(始终具有与 class 0 和 class 1 相同的比例X),你总是预测完全相同的值。
与“学习”某些模式或规则相比,模型总是预测 class 0 时获得更好的准确性。这是一个巨大的问题。要解决它,您有以下一些选择:
- 尝试修改随机森林算法的一些超参数。
- 收集更多的数据以获得更大的数据集,你只测试了8个样本(也许是
很难为您获取新数据)
- 您的数据不平衡(class 0 的样本多于 class 1),您
应该考虑使用
SMOTE
library 来平衡它
我正在使用 StratifiedShuffleSplit
重复拆分数据集、拟合、预测和计算指标的过程。你能解释一下为什么每次拆分都给出相同的结果吗?
import csv
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import StratifiedShuffleSplit
from sklearn.metrics import classification_report
clf = RandomForestClassifier(max_depth = 5)
df = pd.read_csv("https://raw.githubusercontent.com/leanhdung1994/BigData/main/cll_dataset.csv")
X, y = df.iloc[:, 1:], df.iloc[:, 0]
sss = StratifiedShuffleSplit(n_splits = 5, test_size = 0.25, random_state = 0).split(X, y)
for train_ind, test_ind in sss:
X_train, X_test = X.loc[train_ind], X.loc[test_ind]
y_train, y_test = y.loc[train_ind], y.loc[test_ind]
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
report = classification_report(y_test, y_pred, zero_division = 0, output_dict = True)
report = pd.DataFrame(report).T
report = report[:2]
print(report)
结果是
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
precision recall f1-score support
0 0.75 1.0 0.857143 6.0
1 0.00 0.0 0.000000 2.0
您构建的每个模型都预测输出始终为 class 0,并且由于您进行了分层拆分(始终具有与 class 0 和 class 1 相同的比例X),你总是预测完全相同的值。
与“学习”某些模式或规则相比,模型总是预测 class 0 时获得更好的准确性。这是一个巨大的问题。要解决它,您有以下一些选择:
- 尝试修改随机森林算法的一些超参数。
- 收集更多的数据以获得更大的数据集,你只测试了8个样本(也许是 很难为您获取新数据)
- 您的数据不平衡(class 0 的样本多于 class 1),您
应该考虑使用
SMOTE
library 来平衡它