减少数据集以获得更好的PCA分解是一种好习惯

时间:2017-09-12 13:46:34

标签: machine-learning scikit-learn pca kaggle

在尝试使用Kaggle(link)上的信用卡欺诈数据集时,我发现如果我减少培训数据集的大小,我可以拥有更好的模型。只是为了解释数据集是由284807个记录的31个特征组成的。在这个数据集中,只有492个欺诈(因此只有0.17%)。

我尝试在完整数据集上执行PCA,以便只保留3个最重要的维度才能显示它。结果如下:

PCA with full dataset

在这一个中,找不到一种模式来确定它是否是欺诈是不可能的。

如果我减少非欺诈的数据集只是为了增加比率(欺诈/非欺诈),这就是我对同一情节的看法

PCA_100000

PCA_10000

PCA_1000

现在,我不知道在减少的数据集上安装PCA是否有意义,以便更好地分解。例如,如果我使用具有100000点的PCA,我们可以说所有具有PCA1的条目> 5是欺诈。

如果您想尝试,这是代码:

dataset = pd.read_csv("creditcard.csv")
sample_size = 284807-492  # between 1 and 284807-492
a = dataset[dataset["Class"] == 1]  # always keep all frauds
b = dataset[dataset["Class"] == 0].sample(sample_size) # reduce non fraud qty

dataset = pd.concat([a, b]).sample(frac=1)  # concat with a shuffle

# Scaling of features for the PCA
y = dataset["Class"]
X = dataset.drop("Class", axis=1)
X_scale = StandardScaler().fit_transform(X)

# Doing PCA on the dataset
pca = PCA(n_components=3)
X_pca = pca.fit_transform(X_scale)

pca1, pca2, pca3, c = X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], y
plt.scatter(pca1, pca2, s=pca3, c=y)
plt.xlabel("PCA1")
plt.ylabel("PCA2")
plt.title("{}-points".format(sample_size))
# plt.savefig("{}-points".format(sample_size), dpi=600)

感谢您的帮助,

1 个答案:

答案 0 :(得分:4)

绝对有道理。

您正在使用的技术通常称为随机欠采样,而在ML中,当您处理不平衡的数据问题(例如您所描述的问题)时,它通常很有用。您可以在Wikipedia page找到更多相关信息。

当然,还有很多其他的方法来处理类不平衡,但这个方法的优点在于它非常简单,有时甚至非常有效。