如何解决机器学习问题?

数据挖掘 机器学习 Python 预测建模 监督学习
2022-02-20 23:23:13

我是机器学习的初学者,没有真正的统计背景(只是基础知识)。我理解论坛上关于标准化数据和绘制图表以查看数据分布的统计方法和技术的一半内容。无论如何,我设法按照Kaggle上人们的步骤创建了多个预测模型但是,我想了解一些关于构建模型时必须采取的步骤的知识。我将使用我处理过的示例来演示我的步骤,如果您发现初学者的错误并且您会的,请指出。

我首先查看我的数据(组合是测试集 + 训练集减去要预测的目标列)

print(combine.isnull().sum())
  1. 0岁
  2. CMP 42855
  3. code_dept 654
  4. id_opportunite 0
  5. mca 4539
  6. 第1624章
  7. nom_organisme 0
  8. 情况 58

好的,一些潜在的预测变量有多种“空值”!

笔记 :

Situation : type = string ,表示此人的社会状况。

Nb_Enfants : type = int ,表示孩子的数量。

cmp : type = string,表示与此人签约的公司的名称(这不是通过电话从某人那里获得的常见信息,这解释了该列上大量的空值)

nom_organisme : type=string ,将这个人推荐给我们的呼叫中心的名称(可能是一个很好的预测指标,根据我的情节,一些中心比其他中心更可能派出统计人员)

年龄:type=int,我想不需要解释

code_dept:type=int,指的是部门的id,一个部门是一个大城镇的一部分,所以这些是位置的id。(从逻辑上讲,它应该是一个很好的预测指标,因为某些部门的签名机会比其他部门高)

问题1:有什么结论可以得出吗?或消除像'cmp'这样的预测器?还是必须做的事情,比如替换空值或预测它们?

这些是我将使用的大部分功能。我想预测一个人是否会与公司签约。我省略了符号列,但它是二进制

这是我的输出分布。略低于

签名:11674(17.7%),非签名:54250(82.3%),总数:65924

*所以我有 2 个输出类 0 和 1,它们不平衡 17% 到 82%!

问题 2:在这种情况下 我应该使用SMOTE吗?或不?是否有其他结论可以从中得出?*

我首先删除了你们所谓的异常值,当然我确保它们是数据捕获中的随机噪音和错误。(是的,我确定它是噪音而不是需要教给模型的模式)

然后,我将这些列一一可视化,并注意符号列的行为。这些是一些例子:

nb_enfants

这显示了在每个孩子数量(从 0 到 5)中以黄色和未在蓝色上签名的人的百分比。

我还认为 value_counts 是必要的!

df3.nb_enfants.value_counts()

nb_enfants!

问题3:从这个情节中是否可以得出其他结论?或从可能的特征中提取信息的其他方式?我可以通过查看这个情节来决定nb_enfants是否是一个很好的预测器吗?

然后我继续“手动”选择我喜欢的功能(这就是我滚动的方式)。

开个玩笑,我选择了在逻辑上会对预测产生影响的特征(我知道有一些方法可以发现肉眼看不到的特征,但我认为我没有达到显示数据和从中提取信息的统计水平,任何欢迎提供有关如何做到这一点的建议)

问题 4:在我的情况下,对于一个好的预测器来说,什么是更好的指标?

我还手动将年龄编码7个类别,将情况(包含字符串,无论如何都需要编码)分为6 个类别,根据我分配的code_dept(此人居住的地方)和nom_organisme(哪个公司将此人推荐给我们公司)创建了2 个特征每个code_deptnom_organisme的类基于签名的人的百分比。

我不喜欢虚拟变量,因为我稍后会在服务器上部署这台机器,用作 Web 服务,我需要对通过请求发送的“人”进行编码,就像我编码我的火车数据集一样,而我设法做到这一点的唯一方法是通过IF在我应用于通过的“人”的函数中进行静态编码。

问题5:我知道静态通常不利于维护或更新。有没有办法在不使用静态编码的情况下进行 Web 服务转换?另外是否建议对每个功能都使用静态编码?

这是一列火车的样本

问题6:对数据有何评论?

我通过这样做为一些特征设置了一个相关矩阵:

plt.figure(figsize=(16,14)) 
foo=sns.heatmap(train.drop(['id_opportunite','mca','code_dept','nom_organisme'],axis=1).corr(), vmax=0.6,square=True, annot=True)

相关矩阵

问题7:应该从这个矩阵中得出什么结论?

我去了: X = train[['age','classe_dep','situation','nb_enfants','classe_organisme']] y = train.loc[:,'signer']

决策树的结果:

le score maximale de l'algorithme Decision Tree est :  84.11%  pour max_leaf_nodes =  52

测试集上的结果:75%的准确率。

问题8:有什么一般的想法或评论?谢谢!

答案应该是验证我的步骤,以及对我的一个或多个问题的一些评论!谢谢!

1个回答

那里有很多问题。我将回答关于准确性的问题:

75% 比随机机会大,可能有用。但是您需要考虑与您的应用程序相关的内容。

例如,假设您正在处理安全问题。拒绝有权访问的人比允许无权访问的人更具破坏性。

如果您想减少销售产品的电话数量,您需要一个可以告诉您呼叫最大潜在客户的模型,如果您不这样做,即使减少 10% 的无用呼叫也是一个具有良好利润的好模型。不会让维持运营成本高得离谱。