使用SK-Learn处理不平衡数据

不平衡数据是机器学习中的一个重要考虑因素。问题是基本的机器学习本质上试图获得最小的误差。

这可以通过上采样数据来处理。这是通过从少数类别中随机选择一个数据点并复制它来完成的。但是,您必须记住一条简单的规则。您必须将数据拆分为测试和训练,对训练进行上采样,并使测试保持不变。这是为了防止副本泄漏到测试数据并人为地提高准确性。这是一个遵循和理解的简单规则,然而,我已经看到研究人员在拆分之前进行了上采样,但是一年后当他们的生产算法无法正常工作时才发现他们的错误。

在这篇文章中,我们对不平衡数据进行了上采样。我们通过使用SK-Learn包装器deploy-ml来完成此操作。如果您没有,请使用pip安装它:

pip install deployml

对于这个例子,我们将使用神经网络。我们从deploy-ml和pandas导入神经网络base,因为必须通过pandas数据帧将数据输入包装器。如果您还没有安装pandas,请不要担心,在运行pip命令时,deploy-ml将自动安装pandas和SK-Learn作为依赖项。

import pandas as pd

from deployml.sklearn import NeuralNetworkBase

然后加载数据。在本例中,数据已经被清理,您将不得不自己清理数据,因为这是每个项目/问题所特有的:

train = pd.read_csv('example_data.csv')

然后,我们使用隐藏层和数据属性定义神经网络模型。在这个例子的数据中,我们试图预测的结果是“paid”,所以我们将outcome_pointer属性称为“paid”:

NN = NeuralNetworkBase(hidden_layers = (7, 3))

NN.data = train

NN.outcome_pointer = 'paid'

Deploy-ml还支持SK-Learn逻辑回归,支持向量机和随机森林。如果要定义自己的SK-Learn模型,可以将其导入deploy-ml以利用训练,测试和部署函数。我们使用quick_train函数训练神经网络:

NN.quick_train(scale=True)

您可以看到我们已将缩放设置为True。这意味着使用SK-Learn标准缩放器缩放数据。有不同的缩放器可用。quick_train函数将数据分成测试和训练,然后训练它。缩放器安装在训练数据上,然后转换训练和测试数据。适合的缩放器自动存储在deploy-ml对象中,因此可以再次使用或保存。

现在让我们来看看指标:

NN.evaluate_outcome()

使用SK-Learn处理不平衡数据

把它分解一下,你可以看到当神经网络说数据点不起作用时,有81%的可能性这是正确的。然而,它只捕捉6%的负面案例。如果神经网络说数据点将支付,有91%的可能它是对的,它捕获100%的付费数据点。这显然是对积极的分类太过慷慨了。我们也可以通过以下方法看到ROC曲线:

NN.show_roc_curve()

使用SK-Learn处理不平衡数据

它没有绘制精度和召回的图像,而是绘制了真实的正确率。如果蓝色曲线沿着虚线绘制,分类器基本上是随机的。

现在我们再次对模型进行训练,这次将resample参数设置为True:

NN.quick_train(scale=True, resample=True)

这使用SMOTE算法对训练数据进行上采样。默认比率设置为1,表示每个正数都有一个负数。如果设置为0.5,则每两个正数会有一个负数。这给出了以下指标:

NN.evaluate_outcome()

使用SK-Learn处理不平衡数据

正如你所看到的,精度下降了,但召回却增加了近10倍。现在,最优的精度和召回取决于个人问题。例如,我正在研究一个金融技术系统,它批准了贷款。购买数据是昂贵的。所以我们设计了一个初始过滤器对所有已经支付的贷款召回1,对没有支付的贷款召回0.4。我们想要这个,因为我们不想让优秀的候选人被排除在外。接下来的设计是,如果信用评分公司通过初始的过滤器将客户的更多数据输入到主神经网络中,就会从该公司获得更多关于客户的数据。这个过滤器减少了我们必须购买的数据量。这篇文章真正关注的是上采样的概念。你对精度和召回的处理本身就是另一个话题,与你正在解决的问题相关。一般来说,重新采样率越低,未付费用户的精度越高,召回率越低。

只需访问model属性即可访问SK-Learn模型:

NN.model

如果要保存模型,只需使用deploy方法:

log.deploy_model(description ='NN with upampling',

author =“maxwell flitton”,organization ='example',

file_name ='neural.sav')

这使您可以再次使用模型,而不会忘记输入顺序或指标等详细信息。要加载模型,您只需使用pickle:

import pickle

loaded_model = pickle.load(open("neural.sav", 'rb'))

这会加载字典。如果您有新数据,可以调用“scaler” key 访问保存的缩放器,并转换新的输入数据:

input_data = loaded_model['scaler'].transform([[1, 28, 0, 1, 30]])

现在您已经处理了新数据,您可以使用以下方法进行计算:

loaded_model['model'].predict(input_data)[0][0]

deploy-ml包装器只需几行代码就可以重新采样并保存记录良好的SK-Learn模型。

相关推荐