笔者邀请您,先思考:
1 您做机器学习和数据科学项目犯过那些错误?
我们研究了数据科学过程中的典型错误,包括错误的数据可视化、错误的缺失值处理、错误的分类变量转换等等。让我们学会如何避免。
在抓取或获取数据之后,在应用机器学习模型之前需要完成许多步骤。
您需要可视化每个变量,以查看分布,找到异常值,并理解为什么会有这样的异常值。
如何处理某些特征中缺失的值?
将分类特征转换成数值特征的最佳方法是什么?
这类问题有很多,但我将详细介绍大多数初学者遇到错误的地方。
1. 可视化
首先,您应该可视化连续特征的分布,以了解如果有许多异常值,分布将是什么,以及它是否有意义。
有许多方法可以可视化它,例如盒箱、直方图、累积分布函数和小提琴图。然而,我们应该选择能够提供最多数据信息的图。
要查看分布(如果是正态分布或双峰分布),直方图将是最有帮助的。虽然直方图是一个很好的起点,但是盒箱在识别异常值的数量和中位数在哪里可能更有优势。
根据这些图,最有趣的问题是:你看到了你期望看到的吗?回答这个问题将帮助您发现数据中的洞察力或错误。
为了获得灵感并理解什么图最有价值,我经常参考Python的seaborn图库。可视化和发现洞察力的另一个好的灵感来源是Kaggle的内核。这是我的kaggle内核,用于深度可视化泰坦尼克数据集。
在租金价格的一文中,我绘制了每个连续特征的直方图,我希望在没有账单和总面积的情况下,租金的分布会有一条长长的右尾。
连续变量的直方图
盒箱图帮助我看到每个特性的离群值的数量。事实上,绝大多数基于无账单租金的离群公寓,要么是200多平方米小店铺的工作室,要么是租金很低的学生宿舍。
连续变量的盒箱图
2. 我是否根据整个数据集来估算值?
由于各种原因,有时会会有一些缺失值。如果我们删除每一个至少有一个缺失值的观测,我们可以得到一个非常精简的数据集。
有许多方法可以插补值,例如均值,中位数等,不管您采用哪种方法,请确保从训练数据集中计算所要插补的统计值,以避免测试集的数据泄露。
在租赁数据中,我也获取了公寓的描述。每当公寓的质量、条件或类型丢失时,如果描述中包含此信息,我将从描述中推断。
3. 如何变换分类变量?
有些算法(取决于实现)不能直接处理分类数据,因此需要以某种方式将它们转换为数值。
将分类变量转换为数字变量的方法有很多,例如标签编码器、一种热编码、bin编码和哈希编码。但是,大多数人在使用One Hot Encoding时会错误地使用标签编码。
在我们的租赁数据中,假设我们有一个公寓类型列,其中包含以下数值:[ground floor, loft, maisonette, loft, loft, ground floor]。 LabelEncoder可以将其转换为[3,2,1,2,2,1],这意味着ground_floor> loft>maisonette。 对于某些算法(如决策树及其偏差),这种编码方式可能会很好,但应用于回归和SVM可能没什么作用。
在租金数据集中,condition编码如下:
new:1
renovated:2
needs renovation: 3
而quality编码如下:
Luxus:1
better than normal: 2
normal: 3
simple: 4
unknown: 5
4. 我需要标准化变量吗?
标准化使所有连续变量具有相同的规模,这意味着如果一个变量的值从1K到1M,另一个变量的值从0.1到1,标准化后它们的范围将相同。
L1或L2正则化是减少过拟合的常用方法,可以在许多回归算法中使用。然而,在L1或L2之前应用特征标准化是很重要的。
租赁价格以欧元计算,如果价格以美分计算,拟合系数将大约扩大100倍。 L1和L2对更大的系数进行更多的惩罚,这意味着它将更小尺度的特征。为了防止这种情况,应在应用L1或L2之前对功能进行标准化。
标准化的另一个原因是,如果您或您的算法使用梯度下降,则梯度下降会随着特征缩放而快速收敛。
5. 我需要推导目标变量的对数吗?
我花了一段时间才明白没有一个普遍的答案。
这取决于许多因素:
你是要分数误差还是绝对误差
你使用那种算法
残差图和度量指标的变化告诉你什么
在回归中,首先要注意残差图和度量指标。有时目标变量的对数化会得到更好的模型,模型的结果仍然很容易理解。然而,还有其他一些有趣的变换,比如开方。
关于这个问题Stack Overflow上有很多答案,我认为原始和对数化目标变量上的残差图和RMSE很好地解释了它。
对于租金数据,我推导出了价格的对数,因为残差图看起来更好一些。
租金的对数(左)和未转换数据(右)的残差图(不包括账单变量)。 右图显示“异方差性” - 随着预测从小到大,残差变大。
一些更重要的东西
某些算法(如回归)将受到数据中共线性的影响,因为系数变得非常不稳定(更多数学)。 由于内核的选择,SVM可能会或可能不会受到共线性的影响。
基于决策的算法不会受到多重共线性的影响,因为它们可以在不同的树中交替使用特征,而不会影响性能。 然而,由于相关变量可能看起来不那么重要,因此对特征重要性的解释变得更加困难。
机器学习
在熟悉数据并清理异常值之后,这是获得机器学习的最佳时机。 您可以使用许多算法进行有监督的机器学习。
我想探索三种不同的算法,比较性能差异和速度等特征。 这三个是具有不同实现的梯度增强树(XGBoost和LightGMB),随机森林(FR,scikit-learn)和3层神经网络(NN,Tensorflow)。 我选择RMSLE(均方根对数误差)作为优化过程的度量。 我使用了RMSLE,因为我使用了目标变量的对数。
XGBoost和LigthGBM表现相当,RF略差,而NN表现最差。
测试集上算法的性能(RMSLE)
基于决策树的算法非常擅长解释特征。 例如,它们产生特征重要性分数。
特征重要性:找到租赁价格的驱动因素
在拟合基于决策树的模型后,您可以看到哪些特征对于价格预测最有价值。
特征重要性提供了一个分数,指示每个特征在模型中构建决策树时的信息量。 计算此分数的方法之一是计算使用特征在所有树中分割数据的次数。 该分数可以用不同方式计算。
特征重要性可以揭示有关价格主要驱动因素的见解。
对于租赁价格预测,总面积是价格最重要的驱动因素并不奇怪。 有趣的是,一些使用外部API设计的特征也是最重要的因素。
通过分割(上图)和增益(下图)计算的特征重要性
但是,如“使用XGBoost进行可解释的机器学习”中所述,根据属性选项,可能存在特征重要性的不一致。 链接的博客文章和SHAP NIPS文章的作者提出了一种计算特征重要性的新方法,该方法既准确又一致。 这使用了shap Python库。 SHAP值表示特征对模型输出改变的重要性。
对租金数据的分析结果如下图所示。
每间公寓每行有一个圆点。点的x位置是该预测模型的特征对客户的影响,点的颜色表示该特征对于公寓的价值。
领取专属 10元无门槛券
私享最新 技术干货