
机器学习
离散化
1. cut
1 | labels = list('ABCD') |
2. qcut
1 | #每一段都是均分 |
哑变量编码
对于需要分类的变量进行哑变量编码或者one hot编码以方便距离或相似度的计算
eg, 性别/星期/颜色等分类变量的度量
pandas库中的get_dummies()函数可以实现分类变量的哑变量编码
1 | gender = np.array(['M','F','M','F',None,'M','F','M','F'],prefix='Gender') |
什么是机器学习
- 从数据中学习 特征值 + 目标值
- 学习结果为模型
- 预测、识别…
机器学习开发流程
- 获取数据
- 数据处理
- 特征工程
- 机器学习算法训练 + 模型
- 模型评估
- 应用
入门
例子
1 | 比如有🚚和🚗,我怎么让机器去识别? |
-
特征(维度) Feature
1
车长 车宽 车高
这样就是判别是否为卡车还是轿车,so 我们也称它有三个维度
-
算法
1
我现在知道了车宽和车高去判断卡车还是轿车,只需要根据已有的样本空间去判断距离他们的远近即可
-
标签 Label
1
就是卡车和货车
-
预测 Prediction
1
未知的标签,从已知的特征中预测出来
监督学习与非监督学习
监督学习(有目标值)
监督学习是以任务为驱动的方法
这里任务 -----> 就是标签(判断是否为🚚, 判断百公里油耗为多少)
这里就可以看出来,非监督学习就是没有标签
1 | 预测股票 |
分类任务(离散)
回归任务(连续)
非监督学习(无目标值)
就是没有标签,让你胡乱推测
- 比如你去百度搜索某个东西,他会预测你是不是想买,或者想要了解,就会给你推送链接
- 分析用户行为,游戏氪金,大佬就被割韭菜,大数据杀熟
- 基因组,判断每一串基因对人类的影响
聚类

训练,验证,测试与评估
有点乱七八糟的不好理解 多写写代码就懂了
1.训练
总结数据的信息,从中学习有用的规律
2.验证
不参与模型参数的求解 但是 参与模型的学习过程
更多的是属于训练过程
我理解的就是一个做课后作业的过程,查缺补漏
3.测试
与训练过程和模型绝缘用来评估模型的最终效果
属于测试过程
我理解就是期末考试
4.评估
根据指标来判断模型是好是坏
-
腾讯医疗-癌症预测100000
-
训练集80000
1
用于 训练和验证
-
测试集20000
1
用于 评估
-
Sklearn
1. Sklearn数据集
1 | sklearn.databasets |
1.1 sklearn小数据集
例如我要引用鸢尾花的小规模的数据集就可以使用
1 | sklearn.databasets.load_iris() |
波士顿房价数据集
1 | sklearn.databasets.load_boston() |
1.2 sklearn大数据集
1 | sklearn.databasets.fetch_20newsgroups(data_home=None,subset='train') |
- subset: ‘train’或者’test’,’all‘
- 训练集的训练,测试,全部
1.3 数据集的返回值
-
1
2databasets.base.Bunch (字典)
dict['key'] = values-
data:特征值
-
iris['data']1
2
3
4
5
- target:标签值
- ```python
iris.target
-
-
DESCR:数据描述
-
iris.DESCR1
2
3
4
5
- feature_name:特征名
- ```
iris.feature_names
-
-
target_name:标签名
-
iris.target_names1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
### 1.4 数据集的划分
- 训练集:70% 80% 75%
- 测试集:30% 20% 25%
```python
from sklearn.model_selection import train_test_split
# 数据集划分
x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2)
print("训练集的特征值:\n",x_train,x_train.shape)
print("测试集的特征值:\n",x_test,x_test.shape)
print("训练集的目标值:\n",y_train,y_train.shape)
print("测试集的目标值:\n",y_test,y_test.shape)
-
-
特征工程
数据和特征决定了机器学习的上线,模型和算法知识在逼近这个上限
1 | 就是处理数据 |
特征工程内容
- 特征提取
- 机器学习算法 - 统计方法 - 数学公式
- 例如:文本类型 -> 数值
- 类型 -> 数值
- 这里可以用One-hot编码或者哑变量
-
特征预处理
- 特征降维
特征提取
1. 将数据转换为可用于机器学习的数字特征
就是为了计算机更好的理解数据
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取
2. 特征提取API
1 | sklearn.feature.extraction |
字典特征提取
作用: 对字典数据进行特征值化
1 | from sklearn.feature_extraction import DictVectorizer |
1 | import pandas as pd |
应用场景
-
当数据集中类别特征比较多的情况下
1
21.将数据集中的特征=》字典类型
2.DictVectorizer转换 -
当本身拿到的数据就是字典类型就可以用字典特征提取
文本特征提取
单词 作为 特征
句子、短语、单词、字母
1 | 特征:特征词 |
英文文本
1 | from sklearn.feature_extraction.text import CountVectorizer |
中文文本
由于英文每个单词之间默认就是按照空格隔开,但是中文"你好"这种就没有空格
所以要借助一些分词工具 例如jieba分词…
这里引出一个概念:停用词 stop_words
不止是中文这种,比如想一些未知的文本不容易进行分词的就可以使用停用词不将其进入
停用词表
1 | from sklearn.feature_extraction.text import CountVectorizer |
但是按照这种分类会有一个弊病,比如说文章中有很多 因为 、所以 、…这样的词,在别的文章中同样也有很多,这样就会导致特征值的抽取中存在错误
Tf-idf文本特征提取
如果某个词或者短语,在一篇文章中出现的概率高,并且在其它文章中很少出现,则认为这个词或者短语具有很好的类别区分能力,适合用来分类

总结:
TF-IDF就是衡量一个词或短语的重要程度
-
TF - 词频
-
IDF - 逆向文档频率 是一个词语普遍重要性的度量
1
2
3
4
5
6
7
8
9比如现在
1000篇文章 - 语料库
100篇文章 - ”非常“
10篇文章 - ”经济
两篇文章
文章A(100词):10次“经济” TF-IDF = TF x IDF = 0.1 X 2 = 0.2
tf: 10/100 = 0.1
idf: lg 1000/10 = 2
实用
1 | from sklearn.feature_extraction.text import TfidfVectorizer |
特征提取总结
1 | from sklearn.feature_extraction import DictVectorizer |
特征预处理
就是通过一些转换函数将特征数据转换成更加适合算法模型的特征数据的过程
内容
- 数值型数据的无量纲化:
- 归一化
- 标准化
API
1 | sklearn.preprocessing |
案例

- 为什么要进行归一化/标准化
- 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出来几个数量级,容易影响分配
就比如对于这样一种数据,如果你用KNN算法,那么误差会极大,因为消耗时间百分比 与 里程数之间相差太大这样就会直接把消耗时间百分比当作一个无用数据
而归一化 就是将这些数据规划成同等重要,即为无量纲化
归一化
1.定义
通过对原始数据进行变换把数据映射到(默认[0,1])之间
2.公式
作用与每一列,max为每一列的最大值,min为一列的最小值,那么X’'为最终结果,
mx,mi分别为指定区间默认mx为1,mi为0
3.API
3.1MinMaxScaler
1 | from sklearn.preprocessing import MinMaxScaler |
4.缺陷
异常值:最大值、最小值
标准化
1.定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
2.公式
作用于每一列,mean为平均值
标准差: 集中程度
3.API
3.1StandardScaler
1 | from sklearn.preprocessing import StandardScaler |
总结
标准化更适合用于大数据
特征降维
- 处理对象二维数组
- 降低(随机变量)特征的个数
- 得到一组不相关的主变量的过程
- 降低(随机变量)特征的个数
1 | 比如有一组数据相对湿度与降雨量之间的相关 |
降维方式
- 特征选择
- 主成分分析(可以理解一种特征提取的方式)
特征选择
Filter过滤式
- 方差选择法:地方查特征过滤
- 相关系数
- 衡量特征与特征之间的相关性
Embeded嵌入式
- 决策树
- 正则化
- 深度学习
过滤式
1.方差选择法
有小鸟🐦 判断它的品种,你不能看它是否有爪子,因为所有的鸟都有爪子
1 | import pandas as pd |
2.相关系数
- 皮尔逊相关系数
- 反应变量之间相关关系密切程度的统计指标

看最终r的值
-
大于 0 正相关 小于 0 负相关
-
r = 1 完全相关 r = 0 毫无关系
-
0<|r|<1时,存在相关 r ~ 1线性关系密切 r ~ 0 相关变弱
-
一般分为三级
|r| < 0.4低相关
0.4<|r|<0.7显著相关
0.7<=|r|<=1高度相关
3.API
1 | from scipy.stats import pearsone |
4.计算
1 | import pandas as pd |
如果特征与特征之间相关性很高
- 选取其中一个
- 加权求和
- 主成分分析
主成分分析
多维转成二维能看出来是什么的
做降维尽可能的保留原有的特征
API
1 | sklean.decomposition.PCA(n_components=None) |
- 将数据降维
- n_components:
- 小数:保留百分之多少的信息
- 整数:减少到多少特征
instacart降维案例
先了解几个概念
-
透视表:
1
- 数据透视表是一种对大量数据快速汇总分析的交互式动态表格,它能够帮助用户统计分析数据。简单来说,数据透视表也就是对原始表进行分组聚合,压缩数据信息,把不必要的信息从原始数据中剔除,而只将我们想看到的数据信息展示到我们面前!
1 | # 1、获取数据 |
第一节课总结:跟着黑马口说一遍
3.分类算法
目标值: 类别 连续
1、sklearn:转换器和预估器
2、KNN算法
3、模型选择与调优
4、朴素贝叶斯算法
5、决策树
6、随机森林
3.1sklearn转换器和预估器
3.1.1转换器
1 | 特征工程的->父类 |
3.1.2估计器(esimator)
1 | sklearn机器学习算法的实现 |
可以看出来它们都被完整的封装,所以机器学习有一套固定的流程
3.2 K-近邻算法
KNN算法
根据邻居来判断类别
近朱者赤,近墨者黑
3.2.1 KNN简述与距离度量
KNN(K-Nearest Neighbors,K近临算法), 机器学习中最简单的算法
”离谁进,就是谁“
用人眼看就知道这个绿色三角形就是轿车
但是机器没眼,只能靠精密的计算所以这里就引出来了距离度量的算法

3.2.1.1 距离度量

1.欧式距离
1 | 空间之中 两点之间的直线距离 |
2.曼哈顿距离
1 | 就是我走路,不可能沿着直线走,所以我会拐着弯走 |

欧式距离和曼哈顿距离的使用
-
欧式距离都比较可以适用
-
曼哈顿距离
1
2
3
4适用于:
求解过程中使得离群点的影响更小
维度极高的数据 ---> 特征的数量
更适合数据维度没有归一化/不平衡
3.明氏距离

代码初体验

1 | import numpy as np |
可以看出来算法不同相差的结果很大
所以看那些比赛中的排名就是对数据的处理和算法的选择不同而导致得分相差
3.2.2 KNN算法实现步骤
2.1 算法基本思路
- 计算距离
- 排序
- 取前K个样本 ----> 超参数:K值,调参和优化
1 | 这玩意就是 |
这里对于优化超参数
通常就是取若干个超参数:K值 —> 取得若干个结果 ----> 若干个评估
最后这个评估最优的就选这个K值作为超参数
k值选取策略
- 奇数
- k < 一个值 通常是 20
3.2.3 KNN算法的优缺点及改进
优点
-
易于理解
-
不需要庞大的样本数量
-
对于异常值不敏感
1
对离它近的敏感,太远的不鸟它
-
是天然的多分类器
1
只需要关注距离它的几个
-
不需要训练,求解参数
1
有些鸡肋
缺点
-
数据量大时计算量太大
-
不平衡样本处理能力差
-
并不“学习”
-
速度慢、准确率低
改进
加权平均KNN
1 | 正常情况下是只看投票结果 |
权重算法:
就是距离离得远的权重就低,距离离的近的权重就高

3.2.4 KNN机器学习应用
3.2.4.1 徒手写
麻烦,正常不会使用
1 | import numpy as np |
3.2.4.2 Sklearn(Scikit-learn)框架
鸢尾花种类预测
1 |
|
3.2.5 案例:预测facebook签到位置
流程分析:
-
获取数据
-
数据处理
目的:
特征值 x
目标值 y
a. 缩小数据范围
2 < x < 2.5
1.0 < y < 1.5
b.time -> 年月日时分秒
c.过滤签到次数少的地点
-
特征工程:标准化
-
KNN算法预估流程
-
模型选择与调优
-
模型评估
1 |
3.3 模型选择与调优
3.3.1 交叉验证
1 | 就是将训练集再分为 训练集和验证集, |
3.3.2 超参数搜索-网格搜索(Grid Search)
API
1 | """ |
3.4 朴素贝叶斯






