机器学习|kaggle数据挖掘和求解的基本步骤
01
—
数据探索(Exploratory Data Analysis)
对数据进行探索性的分析,通常会用 pandas 来载入数据,并做一些简单的可视化来理解数据。
import pandas as pd df = pd.DataFrame([[1, 1.5],[2.0,2.8]], columns=['int', 'float']) df
iterrows,按行迭代
02
—
可视化
matplotlib 和 seaborn 提供的绘图功能可以方便的展示。
比较常用的图表有:
- 查看目标变量的分布。当数据分布不平衡时,根据评分标准和具体模型的使用不同,可能会严重影响性能。
- 对 Numerical Variable,可以用 Box Plot 来直观地查看它的分布。
- 对于坐标类数据,可以用 Scatter Plot 来查看它们的分布趋势和是否有离群点的存在。
- 对于分类问题,将数据根据 Label 的不同着不同的颜色绘制出来,这对 Feature 的构造很有帮助。
- 绘制变量之间两两的分布和相关度图表。
seaborn热点图
多变量图
散点图
03
—
数据不均衡问题及部分措施
需要考虑数据不均衡问题
上图是数据不均衡问题的一个典型例子,可以看到大部分微博的总互动数(被转发、评论与点赞数量)在0-5之间,交互数多的微博(多于100)非常之少。如果我们去预测一条微博交互数所在档位,预测器只需要把所有微博预测为第一档(0-5)就能获得非常高的准确率,而这样的预测器没有任何价值。那如何来解决机器学习中数据不平衡问题呢?通常处理数据的难度如下所示:
大数据+分布均衡 < 大数据+分布不均衡 < 小数据+数据均衡 < 小数据+数据不均衡
1)上采样和生成新数据点时添加轻微的随机扰动,经验表明这种做法非常有效。
2)多次有放回的下采样,得到多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果,这种方法称为 EasyEnsemble。第二种 BalanceCascade,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。
3)数据合成方法是利用已有样本生成更多样本,这类方法在小数据场景下有很多成功案例,比如医学图像分析等。
04
—
数据预处理(Data Preprocessing)
在构造 Feature 之前,需要对数据集进行一些处理。通常的步骤有:
- 有时数据会分散在几个不同的文件中,需要 Join 起来。
- 处理 Missing Data
- 处理 Outlier
- 必要时转换某些 Categorical Variable 的表示方式。
- 对于 Categorical Variable,常用的做法就是 One-hot encoding。
说到outlier,不得不提下,bias 和 variance概念上区别,bias是偏差(与预测值之间的偏离程度),variance是误差(代表点的离散程度,散不散的衡量),最直观的如下图所示,相对于第二行,第一行的bias都很小;相对于第二列,第一列的variance都很小。
然后,说下最后一条,即对这一变量创建一组新的伪变量,变量对应的取值为 1,其他都为 0。如下,将原本有 7 种可能取值的 Weekdays
变量转换成 7 个 Dummy Variables。为什么要这样做,本来周日和周一日期是挨着的,但是转化为1,和7后,如果画在x轴上,它们就会离得很远,这样给算法一个错觉,这个日期的变化会对目标值一个错误的影响。
05
—
特征选取(Feature Selection)
先做一遍 Feature Selection 能带来一些好处:
- Feature 少,训练快。
- 有些 Feature 之间可能存在线性关系,影响 Model 的性能。
- 通过挑选出最重要的 Feature,可以将它们之间进行各种运算和操作的结果作为新的 Feature,可能带来意外的提高。
特征选取比较实用的方法是 Random Forest 训练完以后得到的特征的重要性,比如下图所示:title特征对泰坦尼克号船员幸运获救起到最重要的作用。
这里用一个例子来说明在一些情况下 Raw Feature 可能需要经过一些转换才能起到比较好的效果。假设有一个 Categorical Variable 一共有几万个取值可能,那么创建 Dummy Variables 的方法就不可行了。
这时一个比较好的方法是根据 Feature Importance 或是这些取值本身在数据中的出现频率,为最重要(比如说前 95% 的 Importance)那些取值(有很大可能只有几个或是十几个)创建 Dummy Variables,而所有其他取值都归到一个“其他”类里面。这也是经常用到的一个技术。
06
—
模型选取(Model Selection)
准备好以上的特征后,就可以开始选用一些常见的模型进行训练了,一般从BaseLine开始,比如以下基本模型:
- SVM
- Logistic Regression
- Neural Networks
以上这些模型在sklearn中都可以直接调包使用。然后,讲这些模型,作为集成模型的Base model,那么常用的集成模型有哪些,最常用的模型基本都是基于决策树的模型:
- Random Forest
- Gradient Boosting
- GBDT
当然还有业界优秀的 Xgboost 。
07
—
参数调优(Tuning)
在训练时,我们主要希望通过调整参数来得到一个性能不错的模型,一个模型往往会有很多可调节的超参数,比如对 sklearn 的 RandomForestClassifier 来说,比较重要的就是随机森林中树的数量 (n_estimators )以及在训练每棵树时最多选择的特征数量(max_features)
通常我们会通过一个叫做 Grid Search 的过程来确定一组最佳的参数,这是一个暴力搜索的过程。
一般的调参步骤是:将训练数据的一部分划出来作为验证集,通常先将学习率设得比较高(比如 0.1),用 Grid Search 对其他参数进行搜索,逐步将 学习率降低,找到最佳值。以验证集为监视表,找到的最佳参数组合。
08
—
总结
总结了数据探索,数据可视化,数据不平衡问题的部分解决措施,数据预处理,数据特征选取,模型选择,参数调优的基本过程。
- node实现watcher的困境
- Java基础-03(02).总结运算符、键盘录入、if语句
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十一)数据层优化-druid监控及慢sql记录
- python数据分析师面试题选
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(九)数据层优化-jdbc连接池简述、druid简介
- webpack配置别名alias出现的错误匹配
- 在Java程序中处理数据库超时与死锁
- 如何用TensorFlow和TF-Slim实现图像标注、分类与分割
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合
- 使用shell脚本查看数据库负载情况(第二篇)(r3笔记第92天)
- tensorflow LSTM + CTC实现端到端OCR
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能
- 黑客比程序员牛在哪?
- oracle工具集初探(r4笔记第8天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法