【发布时间】:2017-09-12 13:46:34
【问题描述】:
在尝试在 Kaggle (link) 上处理信用卡欺诈数据集时,我发现如果我减少用于训练的数据集大小,我可以获得更好的模型。只是为了解释数据集是由 31 个特征的 284807 条记录组成的。在这个数据集中,只有 492 次欺诈(所以只有 0.17%)。
我尝试对完整数据集进行 PCA,以仅保留 3 个最重要的维度来显示它。结果如下:
在这一个中,不可能找到一种模式来确定它是否是欺诈。
如果我减少非欺诈的数据集只是为了增加比率(欺诈/非欺诈),这就是我在同一个情节中所拥有的
现在,我不知道将 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)
感谢您的帮助,
【问题讨论】:
标签: machine-learning scikit-learn pca kaggle