机器学习(一) 数据抽取 归一化 标准化

机器学习

机器学习简介

图灵 人工智能之父
马文 李 闵斯基 对人工智能有突出贡献

机器学习: 比如说过滤一些邮件
深度学习: 识别猫的样子等等

计算能力和数据大小还有算法的发展影响人工智能的发展

机器学习深度学习做什么?

  • 可以识别很多东西 比如说车辆 在街上的电子摄像头
  • 医疗方面 可以看X光识别什么病
  • 图片艺术化 代替PS的工作 自动转化
  • 信贷需求预测
  • 店铺销量预测

包括:

  • 自然语言处理
  • 图像处理
  • 传统预测

机器学习课程:

  • 特征工程
  • 模型策略优化
  • 分类 回归和聚类
  • Tensorflow
  • 神经网络
  • 图像识别
  • 自然语言处理

机器学习概述

什么是机器学习?
机器学习是从数据中自动分析获得规律(模型),并利用规律进行未知数据进行预测

为什么需要机器学习?

  • 解放生产力 智能客服 不知疲倦的可以进行24h的作业
  • 解决专业问题 ET医疗 帮助看病
  • 提供社会便利 杭州的城市大脑

领域:医疗 航空 教育 物流 电商
目的:让机器学习程序替代手动的步骤,减少企业的成本也提高企业的效率

数据集的收集和构成

从历史数据收集规律,一般是文件csv

mysql不用,原因:

  • 性能瓶颈,读取速度遭到限制
  • 格式不太符合机器学习要求的数据格式

pandas:可以直接读取数据,基于numpy:动态语言 释放GIL(锁) 四个线程 真正的多线程
构成:

  • 可用的数据集
    • kaggle特点:
      • 大数据竞赛平台
      • 真实数据
      • 数据量大
    • scikit-learn
      • 数据量小
      • 易学习
        具體构成:数据值+目标值

特征工程的定义

pandas: 一个数据读取数据非常方便以及基本的格式处理格式的工具
sklearn: 对于特征的处理提供了强大的接口
特征工程
就是将原始数据转换成更好的代表预测模型潜在问题的特征的过程,从而提高了对未知数据的预测准确性。

scilit-learn库介绍

  • Python语言是机器学习工具
  • Scikit-learn包括许多知名的机器学习算法的实现
  • Scikit-learn文档完善 容易上手 丰富的API 使得在学术界很受欢迎
  • 稳定版本是0.18

字典特征数据的抽取

  • 特征抽取实例演示
  • sklearn特征抽取API
  • 字典特征抽取
  • 文本特征抽取

结论 : 特征抽取对文本数据进行特征值化
作用 : 对字典数据进行特征值化
特征抽取API: sklearn.feature_extraction.DictVectorizer

DictVectorizer(sparse = True,…)

  • DictVectorizer.fit_transform(X)
    • X: 字典或者包含字典的迭代器
    • 返回值: 返回sparse矩阵
  • DictVectorizer.inverse_transform(X)
    • X:array数组或者sparse矩阵
    • 返回值:转换之前数据格式
  • DictVectorizer.get_feature_names)
    • 返回类别名称
  • DictVectorizer.transform(X)
    • 按照原先的标准转换

流程

  1. 实例化类 DictVectorizer
  2. 调用 fit_DictVectorizer方法输入数据并转换 注意返回格式

code举例:

# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
    '''字典抽取'''
    # 实例化
    dict = DictVectorizer()
    # 调用fit_transform
    data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
    print(data)
    return None

if __name__ == "__main__":
    dictvec()

输出:

  (0, 1)	1.0 # 节约内存 方便读取处理
  (0, 3)	100.0
  (1, 0)	1.0
  (1, 3)	60.0
  (2, 2)	1.0
  (2, 3)	30.0

code2:

# 导入包
from sklearn.feature_extraction import DictVectorizer
def dictvec():
    '''字典抽取'''
    # 实例化
    dict = DictVectorizer(sparse = False) # 指定False的话
    # 调用fit_transform
    data = dict.fit_transform([{'city': '北京','temperature': 100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature': 30}])
    print(dict.get_feature_names())
    print(dict.inverse_transform(data))
    print(data)
    return None

if __name__ == "__main__":
    dictvec()

输出:

['city=上海', 'city=北京', 'city=深圳', 'temperature']
[{'city=北京': 1.0, 'temperature': 100.0}, {'city=上海': 1.0, 'temperature': 60.0}, {'city=深圳': 1.0, 'temperature': 30.0}]
[[  0.   1.   0. 100.]
 [  1.   0.   0.  60.]
 [  0.   0.   1.  30.]]

矩阵 ndarray的类型 维度是2 二维数组
one-hot编码
[[ 0. 1. 0. 100.]
[ 1. 0. 0. 60.]
[ 0. 0. 1. 30.]]
字典数据抽取: 把字典中一些类别的数据,分别转换成特征
[‘city=上海’, ‘city=北京’, ‘city=深圳’, ‘temperature’]
数组形式的话 有类别的这些特征 先转换成字典数据 再进行抽取
one-hot编码
我们做的是为每个类别生成一个布尔值,这些列中只有一列可以为每个样本取值为1,因此,术语一个热编码

文本特征抽取: Count

作用: 对文本数据进行特征值化
类: skearn.feature_extraction.text.CountVectorize

def countvec():
    '''对文本进行特征值化'''
    cv = CountVectorizer()
    data = cv.fit_transform(["hello world",'hello china hello puyang hello guosihan'])
    print(data.toarray()) # 数字代表的是统计次数
    print(cv.get_feature_names()) # 统计所有文章当中没有出现的重复的词 也就是重复的只看做一次
    return None

if __name__ == "__main__":
    # dictvec()
    countvec()

输出:

[[0 0 1 0 1]
 [1 1 3 1 0]]
['china', 'guosihan', 'hello', 'puyang', 'world']

注意:

  1. 统计所有文章当中所有的词,重复的只看做一次
  2. 对每篇文章,在词的列表里面进行统计每个词出现的次数
  3. 单个字母不统计 对于单个英文字母不统计

中文的特征值化

code:

def cutword():
    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():
    '''中文特征值化'''
    cv = CountVectorizer()
    c1,c2,c3 = cutword()
    data = cv.fit_transform([c1,c2,c3])
    print(data.toarray())  # 数字代表的是统计次数
    print(cv.get_feature_names())
    return None

if __name__ == "__main__":
    # dictvec()
    hanzivec()

输出:

[[0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 0 1 0 0 0 0]
 [0 0 1 0 1 0 0 1 1 1 0 2 1 1 0 0 0 0 0 0 1 0 0 0 1 0 0 3 0 0 1]
 [1 1 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 1 0 0 0 0 1 0 1 0 1 1 1 0]]
['一个', '一点', '不服', '不要', '之心', '今天', '体会', '信服', '做到', '别学', '境界', '学习', '就要', '开始', '慢慢', '所以', '才能', '执行', '折扣', '放弃', '敬畏', '明天', '残酷', '照着', '知识', '练习', '美好', '老师', '达到', '过程', '首先']

tf-df分析问题

Tf: term frequency 词的频率
idf: 逆文档频率 inverse document frequency 出现的次数 log(总文档数量/该词出现的文档数)
注: log(数值): 输入的数值越小 结果越小
tf * idf 称之为 重要性
tf-df主要思想: 如果某个词或者短语在一篇文章中出现的频率比较高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
作用: 用以评估一个词对于一个文件集或者一个语料库中的其中一份文件的重要程度。

def tfidfvec(): # 调查词汇的重要性
    c1,c2,c3 = cutword()
    print(c1,c2,c3)
    tf = TfidfVectorizer()
    tf = tf.fit_transform([c1,c2,c3])
    print(tf.toarray())  # 数字代表的是统计次数
    print(tf.get_feature_names())
    return None

if __name__ == "__main__":
    # dictvec()
    # hanzivec()
    tfidfvec()

输出:

今天 很 残酷 , 明天 很 美好 , 所以 不要 放弃 刚 开始 学习 , 首先 要 做到 对 老师 和 知识 的 “ 敬畏 之心 ” 。 学习 就要 先 信服 老师 , 不服 老师 就 别学 所以 , 刚 开始 , 你 要 照着 老师 说 的 , 不 打   一点   折扣 的 去 执行 , 在 练习 的 过程 中 慢慢 体会 , 才能 达到 下 一个 “ 破 ” 的 境界
[[0.         0.         0.         0.38988801 0.         0.38988801
  0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.29651988 0.         0.
  0.         0.38988801 0.         0.38988801 0.38988801 0.
  0.         0.         0.38988801 0.         0.         0.
  0.        ]
 [0.         0.         0.23073104 0.         0.23073104 0.
  0.         0.23073104 0.23073104 0.23073104 0.         0.46146208
  0.23073104 0.1754769  0.         0.         0.         0.
  0.         0.         0.23073104 0.         0.         0.
  0.23073104 0.         0.         0.52643071 0.         0.
  0.23073104]
 [0.26982522 0.26982522 0.         0.         0.         0.
  0.26982522 0.         0.         0.         0.26982522 0.
  0.         0.20520903 0.26982522 0.20520903 0.26982522 0.26982522
  0.26982522 0.         0.         0.         0.         0.26982522
  0.         0.26982522 0.         0.20520903 0.26982522 0.26982522
  0.        ]]

特征预处理-归一化

特征预处理就是通过特定的统计方法(数学方法)将数据转换成算法要求的数据
对数值型数据: 标准缩放

  1. 归一化
  2. 标准化
  3. 缺失值
    类别型数据: one-hot编码
    时间类型: 时间的切分

sklearn特征预处理API

  • sklearn.preprocessing

归一化特点: 通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式:
归一化公式
X’’ = X’ * (mx - mi) + mi
注: 作用于每一列,max为一列的最大值,min为一列的最小值,那么X’‘为最终结果,mxmi分别为指定区间默认mx为1,mi为0.

MinMaxScalar语法
MinMaxScalar(feature_range = (0,1)...)

  • 每个特征缩放到给定范围(默认[0,1])
  • MinMaxScalar.fit_transform(X)
    • X:numpy array格式的数据[n_samples,n_features]
    • 返回值: 转换后的形状相同的array

code:

def mm():
    '''归一化处理'''
    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

if __name__ == "__main__":
    # dictvec()
    # hanzivec()
    # tfidfvec()
    mm()

输出:

[[3.         2.         2.         2.        ]
 [2.         3.         3.         2.83333333]
 [2.5        2.5        2.6        3.        ]]

如果一组数据中三个特征同样重要时候,要进行归一化处理。
归一化目的: 使得某一个特征对最终结果不会造成更大的影响

异常点对最大值最小值影响太大
归一化总结: 注意在特定场景下最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。

标准化:(使用最常见的)

在这里插入图片描述
注:异常点对标准化影响不大,但是是在一定数据量之上影响不大,从而方差改变较小。
skearn特征化API

  • sklearn.preprocessing.StandardScaler
    处理之后每列来说所有数据都聚集在均值0附近标准差差为1
    在这里插入图片描述
    code:
def stand():
    '''标准化缩放'''
    std = StandardScaler()
    data = std.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
    print(data)
    return None

if __name__ == "__main__":
    # dictvec()
    # hanzivec()
    # tfidfvec()
    # mm()
    stand()

(标准化)输出:

[[-1.06904497 -1.35873244  0.98058068]
 [-0.26726124  0.33968311  0.39223227]
 [ 1.33630621  1.01904933 -1.37281295]]

标准化总结:
在已有的样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
如何处理数据中的缺失值:
一般不建议删除 建议去插补 平均值和中位数之类的来填补
sklearn填补API: sklearn.preprocessing.Imputer
在这里插入图片描述
Imputer流程

  1. 初始化Imputer,指定"缺失值",指定填补策略,指定行或列
  2. 缺失值也可以是别的指定要替换的值
  3. 调用fit_transform

code:

def imp():
    '''缺失值处理'''
    im = Imputer(missing_values= 'NaN',strategy='mean',axis=0) # 用平均值去填补 axis = 0 是按列
    data = im.fit_transform([[1,2],[np.nan,3],[7,6]])
    print(data)
    return None

if __name__ == "__main__":
    # dictvec()
    # hanzivec()
    # tfidfvec()
    # mm()
    # stand()
    imp()

输出:

[[1. 2.]
 [4. 3.]
 [7. 6.]]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值