学习资料:链接
DAY1
1.机器学习概述
1.1 什么是机器学习?
- 官方:从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测。
- 老师解释:
- 模型:算法模型,是一个特殊的对象。该算法模型对象中已经集成或封装好了某种形式的方程/算法。(还没有求出节的方程)
- 模型作用:
- 预测:通过方程或算法产生一个新的未知的数据、事物
- 分类:将一个未知归类的事物给其归属到一个已有的类群中
- 注意:算法模型对应的算法或者方程求出的解就是预测或分类的结果
- 样本数据:
- 模型训练:将样本数据带入模型中,进行训练(给方程进行求解操作),模型训练好了后,则模型的方程就有唯一的解或最优解。有解后则模型就可以实现分类或预测的功能
- 构成:
- 特征数据:自变量
- 标签、目标数据:因变量
- 模型的分类:
- 有监督学习:模型需要的样本数据必须包含特征数据和标签数据,则该模型为有监督学习
- 无监督学习:模型需要的样本只需要有特征数据即可,目标数据有或无均可
- 样本数据(数据集)载体:
- 通常历史数据不存在数据库,存在文件中(csv)
- 数据库存储问题:
- 性能:数据量级大的数据很难存储和高效读写
- 数据存储格式不符合机器学习要求的数据格式
- 样本数据获取途径:
- kaggle
- UCI数据集:常用的机器学习标准测试数据集data
- sklearn
- why机器学习:
- 解放生产力
- 解决专业问题 ET医疗
- 提供社会福利:杭州城市大脑,无人超市等
1.2 特征工程
- 特征抽取
- 数据特征预处理
- 特征选择
- 为什么需要特征工程:
样本数据的特征可能存在缺省值,重复值,异常值等,需要对特征中的相关噪点数据进行处理。处理的目的是为了营造一个更纯净的样本集,让模型基于这组数据有更好的预测能力。 - 什么是特征工程:
将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高对未知数据预测的准确性。- AlphaGo学习的数据,有歌词,有食谱,有棋谱,干扰数据会影响AlphaGo学习。
- 特征工程意义:
影响模型预测的结果 - 如何实现:
sklearn- python中的机器学习工具,包含学习算法实现、文档完善,易上手。
- 功能:
- 分类
- 回归
- 聚类
- 特种工程
1.2.1 特征抽取
- 目的:数据通常是字符串或其他类型数据,需要转换为数值型数据。
- 演示:字符串转为数字
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['lift is short, i love python','lift is too long, i hate python'])
print(res.toarray())
结论:特征抽取对文本等数据进行特征值化,特征值化是为了让机器更好的理解数据。
- 字典特征抽取
- 作用:对字典数据特征值化
- API:from sklearn.feature_extraction import DictVectorizer
- fit_transform(X):x为字典或包含字典的迭代器,返回值为sparse矩阵
- inverse_transform(X):X为sparse矩阵或array数组,返回值为转换之前的数据格式
- transform(X):按原来的标准转换
- get_feature_names():返回类别名称
from sklearn.feature_extraction import DictVectorizer
alist=[
{'city':'BeiJing', 'temp':33},
{'city':'GZ', 'temp':42},
{'city':'SH', 'temp':40}
]
d = DictVectorizer()
feature = d.fit_transform(alist)
print(feature)#feature就是特征值化的结果
sparse矩阵:
- 在DictVectorizer类的构造方法中设定sparse=False,则返回的就不是sparse矩阵,而是一个数组。
- sparse矩阵是一个变相的数组或列表,目的是为了节省内存。
from sklearn.feature_extraction import DictVectorizer
alist=[
{'city':'BeiJing', 'temp':33},
{'city':'GZ', 'temp':42},
{'city':'SH', 'temp':40}
]
d = DictVectorizer(sparse=False)
feature = d.fit_transform(alist)
print(d.get_feature_names())
print(feature)#feature就是特征值化的结果
OneHot编码
- sparse矩阵中的0,1是OneHot编码
- 特征抽取的目的是对非数值型的数据进行数值化,任意数值表示类别,数值是否有优先级或者权重之分呢?One-hot
- pandas实现:pd.get_dummies(df[‘col’])
- 文本特征抽取
- 作用:对文本数据特征值化
- API:from sklearn.feature_extraction.text import CountVectorizer
- fit_transform(X):x为文本或包含文本字符串的可迭代对象,返回值为sparse矩阵
- inverse_transform(X):X为sparse矩阵或array数组,返回值为转换之前的数据格式
- get_feature_names():返回类别名称
- toarray:sparse矩阵转换成数组
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['lift is is short, i love python','lift is too long, i hate python'])
print(res)#res就是特征值化的结果
print(vector.get_feature_names())
print(res.toarray())
#单字母不统计(单字母代表不了实际含义),然后每个数字表示的是单词出现的次数
中文:对有标点符号的中文文本进行特征抽取
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['人生苦短,我用python','人生漫长,不用python'])
print(res)#res就是特征值化的结果
print(vector.get_feature_names())
print(res.toarray())
中文:对有标点符号且有空格分隔的中文文本进行特征抽取
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(['人生 苦短,我 用python','人生 漫长,不 用python'])
print(res)#res就是特征值化的结果
print(vector.get_feature_names())
print(res.toarray())
- 目前CountVectorizer只对有标点符号和用分隔符对应的文本进行特征抽取,显然不满足日常需求:在自然语言处理中,需要将一段中文文本中相关的词语,成语,形容词进行抽取
- jieba分词:对中文进行分词处理(pip install jieba)
import jieba
jb=jieba.cut('我是一个好人')
content= list(jb)
print(content)
ct = ' '.join(content)
print(ct)
jb1 = jieba.cut('人生 苦短,我 用python,你觉得我说的对吗?')
ct1 = ' '.join(list(jb1))
jb2 = jieba.cut('人生 苦短,我 用python,你说我说的对不对!')
ct2 = ' '.join(list(jb2))
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform([ct1,ct2])
print(res)#res就是特征值化的结果
print(vector.get_feature_names())
print(res.toarray())
#单个汉字不统计
1.2.2 特征预处理(对数值型数据进行处理)
- 无量钢化:
- 在机器学习算法实践中,我们往往有着将不同规格数据转换到同一规格,或将不同分布的数据转换到某个特定分布的需求。这种需求统称为“无量纲化”,譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经网络,无量纲化可以加快求解速度;而在距离类模型,警如K近邻, K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。(一个特例是决策树和树的集成算法们,对决策树我们不需要无量纲化,决策树可以把任意数据处理的很好)。
- 预处理是实现无量纲化的方式
- 特征抽取后可以获取对应的数值型的样本数据,然后进行数据处理
- 概念:通过特点的统计方法,将数据转换成算法要求的数据
- 方式:
- 归一化
- 标准化
- 归一化案例分析:
- 如果认为每个特征具有同等大小的权重,同等重要,必须对其进行归一化处理
- 使用KNN算法对特征影响进行说明
- 归一化实现:
- 对原始数据变化,映射到[0,1]之间。
- 公式
- 归一化数据服从正太分布
- API:from sklearn.preprocessing import MinMaxScaler
- 参数:feature_range 缩放范围,通常用(0,1)
- 作用:使得某一个特征对最终结果不会造成很大影响
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler(feature_range=(0,1))#特征缩放的范围
data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]]
data = mm.fit_transform(data)#data需要归一化的特征
print(data)
- Q:如果数据中异常值比较多,会有什么影响?
- A:异常值对原始特征中最大值和最小值的影响很大,因此会影响对归一化之后的值。这也是归一化的弊端,无法很好的处理异常值。
归一化总结:特定场景下,最大值和最小值是变化的,最大最小值很容易受异常值的影响,所有归一化的方式具有局限性。可以使用标准化!
- 标准化
- 数据按均值中心化后,再按标准差缩放,数据会服从为均值为0,标准差为1的正态分布(标准正太分布),这个过程,叫数据标准化(Standardization, Z-score normalization)
- 异常值对均值和标准差影响不大
- 总结:归一化,异常值会影响特征的最大最小值,最终结果受影响;标准化,若出现异常点,由于具有一定的数据量,少量的异常点对平均值影响不大,标准差改变比较少。
- StandardScaler和MinMaxScaler选择:
- 看情况,一般,StandardScaler进行特征缩放,PCA、聚类、逻辑回归、支持向量机、神经网络等算法,选择StandardScaler;
- MinMaxScaler在不涉及距离度量、梯度、协方差计算及数据需要被压缩到特定区间时使用广泛,如数字图像处理,量化像素强度,会将数据压缩到[0,1]之间。
- 建议,先StandardScaler,效果差换MinMaxScaler
- API
- 处理后,每列所有数据都聚集在均值0,标准差1范围附近
- API:from sklearn.preprocessing import StandardScaler
- fit_transform(X):对X进行标准化
- mean_:均值
- var_:方差
- 数据按均值中心化后,再按标准差缩放,数据会服从为均值为0,标准差为1的正态分布(标准正太分布),这个过程,叫数据标准化(Standardization, Z-score normalization)
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
data = [[90,2,10,40],[60,5,15,45],[73,3,13,45]]
ss.fit_transform(data)
1.2.3 特征选择(从特征中选择出有意义对模型有帮助的特征作为最终的机器学习输入的数据)
-
切记:
- 特征选择前,三件事:与数据提供者联系,与数据提供者沟通,与数据提供者开会
- 提供数据的人,尤其是理解业务和数据含义的人,需要聊一下。理解数据是特征选择的第一步。根据目标,用业务常识来选择特征。
-
原因:
- 冗余:部分特征的相关度高,容易消耗计算机性能
- 噪点:部分特征对预测结果有偏执影响
-
实现:
- 人为对不相干特征主观舍弃
- 无法依赖业务理解选择时:
- 在已有特征和对应预测结果的基础上,使用相关工具过滤一些无用或权重较低的特征
- 工具:
- Filter(过滤式)
- Embedded(嵌入式)决策树模型会自己选择出对其终于的特征
- PCA降维
-
Filter过滤式(方差过滤)
- 原理:通过特征本身的方差筛选特征的类。比如一个特征本身方差很小,表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,深圳整个特征的取值都相同。无论特征工程要做什么,都要优先消除方差为0或方差极低的特征。
- API:from sklearn.feature_selection import VarianceThreshold
- VarianceThreshold(threshold=x) threshold方差的值,删除所有方差低于x的特征,默认值为0表示保留所有方差为非0的特征
- fit_transform(X):X为特征
from sklearn.feature_selection import VarianceThreshold
#threshold方差的值,删除所有方差低于x的特征,默认值为0表示保留所有方差为非0的特征
v = VarianceThreshold(threshold=0)#=3,删除方差低于3的特征
v.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
- 方差为0,或方差低的特征过滤后,剩余特征还有很多货模型效果没有明显提升,方差也可以帮忙【一步到位】。留下一半的特征,设定一个特征总数减半的阈值,找到特征方差中位数,将其作为参数threshold的值输入即可。
- VarianceThreshold(np.median(X.var().values)).fit_transform(X)
- X为样本数据中的特征列
import numpy as np
feature = np.random.randint(0,100,size=(5,10))
print(feature)
med = np.median(feature.var(axis=0))
v = VarianceThreshlod(threshold=med)
v.fit_transform(feature)
- 方差过滤对结果影响:
- 用KNN在方差过滤前后效果及时间对比:时间少了10分钟,效率上升1/3
- 主要对象:需要遍历特征的算法模型,目的:在维持算法表现前提,帮助算法降低成本。
- PCA降维(主成分分析),简化数据集
- 降维的维度值是特征的种类
- 如何最好的对一个立体的物体用二维表示,使用低纬度表示高纬度物体,有信息误差,想办法让信息差异最小
- 特征数量上百,上千,考虑数据优化。数据维度压缩,尽可能降低源数据维度(复杂度),损失少量信息
- 作用:消减回归分析或聚类分析中特征的数量
- 原理:5个原始的二维特征,映射到一维线段上变成4个特征
- from sklearn.decomposition import PCA
- n_components 可以为小数(保留特征的百分比),整数(减少到的特征数量)
- pca.fit_transform(X)
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
DAY2
2.sklearn数据集
2.1数据集划分
- 前提:机器学习就是从数据中自动分析获得规律,并利用规律对未知数据进行预测。模型一定要经过样本数据进行训练,才能预测。
- 所有数据都用来训练?
- 不!评估模型,需要一组新的数据。
- 原始数据要分出训练集,测试集
- 不同类型的模型,评估方式不同
- 数据集划分API
- from sklearn.model_selection import train_test_split
- train_test_split(x,y,test_size,random_state):
- x:特征
- y:目标
- test_size:测试集比例
- 打乱的随机种子
- 返回:训练特征,测试特征,训练目标,测试目标
2.2 数据集接口介绍
- sklearn.datasets.load_*():获取小规模数据集
- sklearn.datasets.fetch_*(data_home=None,subset):获取大规模数据集。data_home表示数据集下载目录,None默认值表示家目录/scikit_learn_data(自动创建该文件夹)下。需要从网络下载.subset为需要下载的数据集,可以为train,test,all
#方式一:小规模
import sklearn.datasets as datasets
iris = datasets.load_iris()
iris
#样本数据抽取
feature = iris['data']
target = iris['target']
feature.shape
target.shape
#方式2:较大规模
datasets.fetch_20newsgroups(data_home=None,subset='all')
2.3 鸢尾花数据集拆分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(feature, target, test_size=0.2,random_state=2020)
# x_train, y_train
# x_test, y_test
3.机器学习算法
3.1 算法分类
3.1.1前提
- 算法是核心,数据是计算基础
- 技能
- 学会分析问题,使用相关算法完成对应需求;
- 掌握算法基本思想,学会对不同问题选择对应算法
- 学会利用框架、库解决问题
- 数据类型:
- 离散型数据:通过计数方式获取,对要统计的对象计数,增长量非固定
- 连续型数据:叠加的,增长量可以划分为固定的单位
- 连续型数据有规律,离散型没有规律
3.1.2 分类、回归问题
- 分类算法:目标数据为离散型数据
- 回归算法:目标数据为连续型数据
- 社会产生的数据必然是离散型或连续性数据,企业针对数据产生的需求也就两种
3.1.3 应用
- 预测电影票房:回归
- 预测明天是否晴天:分类
- 人脸识别:分类
3.2 开发流程
- 数据采集
- 公司产生数据
- 与其他公司合作
- 购买
- 爬虫
- 分析数据要解决的需求,是回归还是分类
- 数据基本处理
- 数据清洗
- 合并
- 级联等
- 特种工程:对特征进行处理
- 特征抽取
- 特征预处理
- 降维等
- 选择合适的模型,训练
- 模型评估
- 上线使用
3.2 KNN分类模型
3.2.1 知识点
- K-Nearest Neighbor,KNN
- k-近邻算法采用测量不同特征值之间的距离方法进行分类
- k值作用(k个最近,可能影响分类)
- 欧几里得距离:多维空间中各个点之间的绝对距离
- 电影分类
3.2.2 sklearn中使用K-近邻算法
- 分类:from sklearn.neighbors import KneighborsClassifier
- 实例:鸢尾花分类