机器学习
概述
- 影响人工智能发展的因素
- 硬件的计算能力
- 数据的限制
- 算法的发展
- 机器学习/深度学习应用场景
- 图像识别
- 人像/物体识别
- 图像艺术
- 自然语言处理
- 传统预测
- 数据的预测
- 图像识别
- 机器/深度学习库和框架
- scikit learn
- tensorflow
- theano
- caffe2
- chainer
- 什么是机器学习
- 是从 数据 中自动分析获得 规律(模型) ,并利用规律 对未知数据进行预测
- 举例:
- AlphaGo
- 广告搜索
- 为什么需要机器学习
- 解放生产力
- 智能客服
- 解决专业问题
- ET医疗
- 辅助医疗
- 提供社会便利
- 杭州城市大脑
- 给各个领域带来价值
- 减少成本
- 提高准确率
- 解放生产力
数据集的结构
-
数据的存储
- 以文件(csv)存储
- 为什么不存储在数据库
- 性能瓶颈
- 读取速度
- 格式不符合
- 有pandas读取数据和处理数据比较快,基于numpy
- numpy读取数据为何快
- python有GIL,假的多线程
- numpy 释放了GIL锁,真的多线程
-
数据集的结构组成
- 特征值 + 目标值
- 根据特征值 - 推断出目标值
- 有的特征不是必须要的
-
机器学习中重复数据是否要去重
- 不需要,因为每次学习可能会学习到不同的东西
特征工程
- 特征工程的意义
- 提高预测的效果
- 直接影响预测结果
- 特征转换的步骤
- 实例化一个api
- 调用 fit_transform()
特征抽取
- 用途
- 对文本等数据进行特征值化
- 特征值化是为了让计算机更好的去理解数据
- 特征抽取的API
- 在 sklearn.feature_extraction 中
- 字典特征抽取
sklearn.feature_extraction.DictVectorizer
- 默认:返回的数据类型是sparse矩阵,可以设置为False则为ndarray类型
- 原因是,节约内存,方便读取数据
- 字典数据抽取:
- 把字典中一些类别的数据,分别进行转换成特征
- 意义:
- 数组形式,有类别的这些特征,先要转换成字典数据,然后在特征抽取
- 处理后的数据被称为 one-hot 编码
- 文本特征抽取
- 作用
- 对文本数据进行特征值化
- api
klearn.feature_extraction.text.CountVectorizer
- 返回词频矩阵
- .fit_transform()
- 返回的是sparse类型,要想用数组类型要用
.toarray()
来进行转化
- 统计情况
- 统计所有文章中所有的词,重复的只看做一次,词的列表
- 对每篇文章,在词的列表里面进行统计每个次出现的次数
- 单个汉字/字母不统计
- 原因:没有分类的依据
- 返回词频矩阵
klearn.feature_extraction.text.TfidfVectorizer
- 返回词的权重
- 统计情况
- tf:词的频率, 统计词的出现分次数
- idf:逆文档频率,log(总文档数量/该词出现的文档数): 输入的数值越小,结果越小
- 计算方法: tf * idf : 重要性
- 应用场景
- 文本分类
- 情感分析
- 默认的中文的特征抽取
- 要将中文进行分词,用空格等分开
- 使用jieba分词
- jieba.cut(“分词”)
- 作用
- 代码示例
# coding=utf-8
# 字典特征抽取
from sklearn.feature_extraction import DictVectorizer
# 文本特征抽取
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
import jieba
def dictvec():
"""
对字典进行特征值化
:return:None
"""
# 实例化一个字典特征抽取的对象
dict = DictVectorizer(sparse=False)
# 参数
# sparse: 最后返回的数据类型, 默认为 sparse类型, 如果设置成false则是ndarray类型 ,本实例为二维数组
data = dict.fit_transform(
[{"city": "北京", "temperature": 100}, {"city": "河北", "temperature": 110}, {"city": "深圳", "temperature": 30}])
# 将数据更改为每个对应的字典形式 -- 很少用
print(dict.inverse_transform(data))
# 返回每个的特征对应的标签
print(dict.get_feature_names())
# 返回特征转化的结果 one-hot 编码
print(data)
return None
def countvec():
"""
对文本进行特征值化
:return:None
"""
cv = CountVectorizer()
# 没有 sparse 这个参数,返回是sparse这个类型,可以使用toarray()来进行转化
# data = cv.fit_transform(["life is short, i like python", "life is to long, i dislike python"])
# 按照空格分词,中文一般是要用Jieba分词实现后再传递过来
data = cv.fit_transform(["人生 苦短 我用 python","人生 漫长 我 不用 python "])
# 1. 统计所有文章中所有的词,重复的只看做一次,词的列表
# 2. 对每篇文章,在词的列表里面进行统计每个次出现的次数
# 单个字母不统计
print(cv.get_feature_names())
# 特征的数据,返回sparse
print(data)
print(data.toarray())
return None
def cutword():
"""
分词 返回三句话的分词结果
:return: 分词结果
"""
con1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
con3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 是生成器,要转化成列表
content1 = list(con1)
content2 = list(con2)
content3 = list(con3)
# 将列表转换成字符串,用空格隔开
c1 = " ".join(content1)
c2 = " ".join(content2)
c3 = " ".join(content3)
return c1, c2, c3
def hanzivec():
"""
中文特征值化
词频的统计
:return: None
"""
c1, c2, c3 = cutword()
print(c1,c2,c3)
cv = CountVectorizer()
data = cv.fit_transform([c1,c2,c3])
print(cv.get_feature_names())
print(data.toarray())
return None
def tfidfvec():
"""
中文特征值化
文本类型分类
文本的权重分类
:return: None
"""
c1, c2, c3 = cutword()
print(c1, c2, c3)
tf = TfidfVectorizer()
data = tf.fit_transform([c1, c2, c3])
print(tf.get_feature_names())
print(data.toarray())
return None
if __name__ == '__main__':
# dictvec()
# countvec()
# hanzivec()
tfidfvec()
特征的预处理
使用特定的统计方法(数学方法)将数据转换成算法要求的数据(数值型数据)
-
用途:
- 对数据处理
- 缺失值处理
-
数据处理
-
数值类型数据
- 标准缩放
- 归一化
- 标准化
- 缺失值
- 标准缩放
-
类别型数据: one-hot 编码
-
时间类型: 时间的切分(pandas)
-
-
特征预处理API
sklear.preprocessing
中
-
归一化
- 特点:
- 通过对原始数据进行变换吧数据映射到(默认为[0,1])之间
- api
sklearn.preprocessing.MinMaxScaler
- 参数: feature_range(0,1)
- 特征缩小到什么范围
- 用途
- 多个特征同等重要的时候
- 适用于传统精确度小数据场景
- 目的
- 使得一个特征对最终结果不会早成更大的影响
- 如果数据中异常点较多,会有什么影响?
- 异常点对最大值和最小值,会影响很大
- 缺点:
- 对异常点影响不好
- 公式:
- (x-min)/(max-min)
- 特点:
-
标准化
- 目的
- 使得一个特征对最终结果不会早成更大的影响
- 方差考量数据的稳定性
- 公式:
- (x-平均值)/标准差
- 特点:
- 通过原始数据进行变换把数据变换到均值为0,标准差为1的范围内
- api
sklearn.preprocessing.StandardScaler
- data 返回的类型是array
- 在样本数据足够多的情况下比较稳定,适合嘈杂的大数据场景
- 目的
-
缺失值处理
- 删除 不建议
- 插补 按行/按列 填补平均数等等
- 一般按列去填补
- api
sklearn.impute.SimpleImputer
- pandas 中的数据缺失处理
- pd.dropna
- pd.fillna
- 这两个中的缺失数据必须为np.nan类型
- 浮点数
- sklearn中的缺失数据处理也要是np.nan类型
- 代码示例
# coding=utf-8
# 归一化 标准化 缺失值填补
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.impute import SimpleImputer
import numpy as np
def mm():
"""
归一化处理
:return:None
"""
# 参数feature_range 指定范围
mm = MinMaxScaler(feature_range=(2,3))
data = mm.fit_transform([[90, 2, 10, 40], [60, 4, 15, 45], [75, 3, 13, 46]])
print(data)
return None
def stand():
"""
标准化缩放
:return: None
"""
std = StandardScaler()
data = std.fit_transform([[1.,-1.,3.],[2.,4.,2.],[4.,6.,-1.]])
print(data)
# 返回平均值
print(std.mean_)
# 返回标准差
print(std.scale_)
return None
def im():
"""
缺失值处理
:return:None
"""
# NAN , nan 求平均值默认是列
im = SimpleImputer(missing_values=np.nan,strategy='mean')
data = im.fit_transform([[1,2],[np.nan,3],[7,6]])
print(data)
return None
if __name__ == '__main__':
# mm()
# stand()
im()
数据降维
-
维度
- 特征的数量
- 如: 四个特征:思维
-
降维方式
- 特征选择
- 主成分分析
-
特征选择(数据降维)
- 原因:
- 冗余
- 部分特征的相关度高,容易消耗计算性能
- 噪声
- 部分特征对预测结果有影响
- 冗余
- 特征选择的工具
- Filter(过滤式)
- VarianceThreshold
- 对方差进行过滤
- Embedded(嵌入式)
- 正则化、决策树
- Wrapper(包裹式)
- Filter(过滤式)
- 原因:
-
过滤式 (特征选择工具)
- api
-sklearn.feature_selection.VarianceThreshold
- 参数 threshold
- 来指定方差的大小
- 参数 threshold
- 删除所有低方差特征
- 使用fit_transform(data)返回
- 意义:
- 将差不多的方差个删除掉
- api
-
主成分分析(数据降维)PCA
- 应用场景
- 特征数量达到上百个的时候
- 考虑数据的简化
- 特点
- 数据改变
- 数据的数量会减少
- 高维度出现的问题
- 特征间会出现相关的联系
- 缩放的成度相似
- 目的:简化数据集
- API
sklearn.decomposition
- PCA语法
- PCA(n_components=None)
- n_components
- 小数
- 百分比:0-1
- 信息的损失量
- 一般为 90%-95% 之间
- 整数
- 减少到的特征数量
- 小数
- n_components
- PCA(n_components=None)
- 应用场景
-
代码示例
- 特征选择工具
# coding=utf-8 # 过滤式 from sklearn.feature_selection import VarianceThreshold def var(): """ 方差特征选择 删除地方差的特征 :return:None """ # threshold 来指定删除方差的大小 ,小于这个数的 # 一般取值为 0-10 之内 var = VarianceThreshold(threshold=0.0) data = var.fit_transform([[0,2,0,3],[0,1,4,3],[0,1,1,3]]) print(data) return None if __name__ == '__main__': var()
- 主成分分析
# coding=utf-8 # 主成分分析PCA from sklearn.decomposition import PCA def pca(): """ 主成分分析,进行特征降维 :return: None """ # 保留百分之90的数据信息 pca = PCA(n_components=0.9) data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]]) print(data) return None if __name__ == '__main__': pca()
机器学习基础
-
明确
- 算法是核心,数据和计算是基础
-
找准定位
- 分析很多的数据
- 分析具体的业务
- 应用常见的算法
- 特征工程、调参数、优化
- 注重应用
- 算法的思想
-
机器学习判别依据
- 数据类型
-
数据类型
- 离散型数据
- 记录不同类别个数的数目,所得到的的数据,
- 不能再细分,也不能进一步提高他的精确度
- 有的基本上全是整数
- 区间内不可分
- 连续型数据
- 在某个范围内去任一数
- 取值可以是连续的
- 如: 时间、长度、质量
- 一般为非整数,很多数据都是小数
- 区间内可分
- 离散型数据
-
机器学习算法分类
- 监督学习
- 含有 特征值 + 目标值
- 分类: 目标值离散型
- K-近邻值算法
- 贝叶斯分类
- 决策树与随机森林
- 逻辑回归
- 神经网络
- 回归: 目标值连续型
- 线性回归
- 岭回归
- 标注
- 隐马尔科夫模型(不做要求)
- 非监督学习
- 只有 特征值
- 只有样本
- 聚类
- K-means
- 监督学习
机器学习开发流程
- 原始数据,明确问题是什么
- 建立模型:根据数据类型划分应用种类
- 数据的处理:
- pd 去处理数据(缺失值、合并表……)
- 特征工程(特征进行处理)-重要
- 找到合适的算法进行预测
- 分类
- 回归
- 模型: 算法 + 数据
- 模型的评估,判定效果
- 如果不合格
- 换算法,参数
- 特征工程处理
- 如果不合格
- 上线使用
- 以 API 接口