[转]机器学习之第一天

 

一、机器学习简介

(一)简单介绍
1、“人工智能之父”——图灵
图灵测试(1950)
2、马文·李·闵斯基:把人工智能推向了全世界;
3、人工智能(1950—)------》机器学习(80年代)------》深度学习(2010年以后)
深度学习:图像识别、自然语言处理(可以用程序写一篇报导)、预测(如信贷需求预测、店铺销量预测)、传统预测
影响人工智能的两个因素:①硬件;②数据;③算法(☆)
(二)机器学习用到的库和框架
scikitlearn、TensorFlow、caffe2、chainer
1、机器学习用到的库的发布方即支持语言

框架机构支持语言
TensorFlowGooglePython/C++/Go
CaffeBVLCPython/C++
Kerasfcholletpython
CNTKMicrosoftC++
MXNetDMLCpython/C++/R
Torch7FcaebookLua
TheanoU.Montrealpython
DeeplearningDeeplearning4JJava/Scala
LeafAutumnAIRust
LasagneLasagnepython
NeonNervanaSystemspython

(三)机器学习书和推荐:
python数据分析与数据挖掘、机器学习系统设计、机器学习、面向机器智能TensorFlow实践、TensorFlow
(四)课程概要:
七大块:①特征工程;②模型、策略、优化;③分类、回归和聚类;④TensorFlow;⑤神经网络;⑥图像识别;⑦自然语言处理

二、机器学习概述

(机器学习概述、数据集的结构、数据的特征工程、(数据降维)、数据的类型、机器学习算法基础)
(一)机器学习概述
1、什么是机器学习
机器学习是从数据中自动获取规律(模型),并利用规律对未知数据进行预测
例如:AlphaGo、广告搜索
2、为什么需要机器学习
①解放生产力:智能客服等;
②解决专业问题:辅助医生看病等;
③提供社会便利:杭州的城市大脑等;
目的:
在各个领域内带来价值,用自动代替手动,减少企业的成本也提高企业的效率。
领域:医疗、航空、教育、物流、电商...
(二)数据集的构成
一般存在文件csv
不用MySQL(缺点):性能瓶颈、读取速度;格式不太符合机器学习要求数据的格式;
pandas:读取工具
numpy:GIL(真正的多线程,释放了GIL线程锁)
1、可用数据集:
(1)kaggle
网址:https://www.kaggle.com/datasets;
特点: ①大数据竞赛平台; ②80万科学家; ③真实数据; ④数据量大;
(2)UCI
网址:https://archive.ics.uci.edu/ml/
特点:①收录了360个数据集;②覆盖科学、经济、生活等领域;③数据量几十万
(3)scikit-learn
网址:https://scikitlearn.org/stable/datasets/index.html#datasets
特点:①数据量较小;②方便学习
2、数据集的组成:
结构:特征值+目标值
如:

样本房子面积房子位置房子楼层房子朝向目标值
数据18093080
数据2100951120
数据3801030100

注:有些数据可以没有目标值
3、数据集中对特征值的处理:
pandas:dataframe格式的;缺失值、数据转换等;
scikitlearn:对特征进行处理;
(三)数据的特征工程
1、特征工程是什么
特征工程是将原始数据转换为更好地代表预测模型的潜在问题的特征的过程,从而提高了对未知数据的预测准确性
实质就是提高预测效果
2、特征工程的意义:直接影响预测结果
3、scikitlearn工具介绍:
安装命令:pip install Scikit-learn
(检查是否安装成功:import sklearn)
注:安装scikit-learn需要安装pandas、numpy等库。
sklearn包含的算法有:Classification(分类)、Regression(回归)、Clustering(聚类)、Dimensionality redution(降维)、Model selection(模型选择) 、Preprocessing(特征工程)
4、数据的特征抽取
特征抽取就是对文本等数据(有字典、文本)进行特征值化(转换为数字值);
(1)字典特征抽取
1> 作用:对字典数据进行特征值化
2> 类:sklearn.feature_extraction.DictVectorizer
3> 语法:

 
  1.  
    DictVectorizer(sparse=True,...)
  2.  
    # DictVectorizer.fit_transform(X), 其中X为字典或包含字典的迭代器;返回值:返回spare矩阵
  3.  
    # DictVectorizer.inverse_transform(X), 其中X为array数组或sparse矩阵;返回值:转换之前数据格式
  4.  
    # DictVectorizer.get_feature_names(), 返回类别名称
  5.  
    # DictVectorizer.transform(X), 按照原先的标准转换
 

4> 流程:
①实例化DictVectorizer;
②调用fit_transform方法输入数据并转换
例:

 
  1.  
    # 1、字典类型数据的特征抽取
  2.  
    from sklearn.feature_extraction import DictVectorizer
  3.  
    def dictvec():
  4.  
    # 字典数据抽取
  5.  
    # 实例化
  6.  
    dict = DictVectorizer(sparse=False)
  7.  
    # 调用fit_transform方法输入数据并转换
  8.  
    data = dict.fit_transform([{'city': '北京', 'temperature': 100},
  9.  
    {'city': '上海', 'temperature': 60},
  10.  
    {'city': '深圳', 'temperature': 30}])
  11.  
    print(dict.get_feature_names())
  12.  
    # ['city=上海', 'city=北京', 'city=深圳', 'temperature']
  13.  
    print(data)
  14.  
    dictvec()
  15.  
    # sparse=True时结果为: (结果为sparse矩阵)
  16.  
    # (0, 1) 1.0
  17.  
    # (0, 3) 100.0
  18.  
    # (1, 0) 1.0
  19.  
    # (1, 3) 60.0
  20.  
    # (2, 2) 1.0
  21.  
    # (2, 3) 30.0
  22.  
    # sparse=False时结果为: (结果为数组类型)
  23.  
    # [[ 0. 1. 0. 100.] one-hot编码
  24.  
    # [ 1. 0. 0. 60.]
  25.  
    # [ 0. 0. 1. 30.]]
 

字典数据抽取:把字典中一些类别数据分别转换成特征,数字不进行转换,“上海”“北京”等转换成0、1;
注:数组形式,有类别的这些特征先要转换为字典数据
(2)文本特征提取
1> 作用:对文本数据进行特征化
2> 类:sklearn.feature_extraction.text.CountVectorizer
3> 语法:

 
  1.  
    CountVectorizer(), 返回词频矩阵
  2.  
    # CountVectorizer.fit_transfrom(X) # 其中X为文本或包含文本字符串的可迭代对象;返回值为sparse矩阵
  3.  
    # CountVectorizer.inverse_transform(X) # X为array数组或sparse矩阵;返回值转换之前数据格式
  4.  
    # CountVectorizer.get_feature_names() # 返回值为单词列表
 

4> 对英文进行特征化的流程:
(中文需要先分词,详见5>)
①实例化类:CountVectorizer
②调用fit_transform方法输入数据并转换
(注:返回格式利用toarray()进行sparse矩阵转换为array数组)

 
  1.  
    from sklearn.feature_extraction.text import CountVectorizer
  2.  
    def countvec():
  3.  
    cv = CountVectorizer()
  4.  
    data = cv.fit_transform(['life is short,i like python', 'life is too long,i dislike python'])
  5.  
    data = cv.fit_transform(['life is short,i like python', 'life is too long,i dislike python'])
  6.  
    print(data) # 在每篇文章中统计词的出现次数☆【单个字母不统计,因为一个字母不能代表什么所以不统计】
  7.  
    print(cv.get_feature_names()) # 统计文章中出现一次及一次以上的词
  8.  
    print(data.toarray()) # 把sparse矩阵转换成数组形式
  9.  
    countvec()
  10.  
    结果:
  11.  
    # (0, 5) 1
  12.  
    # (0, 3) 1
  13.  
    # (0, 6) 1
  14.  
    # (0, 1) 1
  15.  
    # (0, 2) 1
  16.  
    # (1, 0) 1
  17.  
    # (1, 4) 1
  18.  
    # (1, 7) 1
  19.  
    # (1, 5) 1
  20.  
    # (1, 1) 1
  21.  
    # (1, 2) 1
  22.  
    #['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
  23.  
    #[[0 1 1 1 0 1 1 0]
  24.  
    # [1 1 1 0 1 1 0 1]]
 

5> 对中文进行特征化的流程:
①对准备好的句子利用结巴进行分词;
②实例化CountVectorizer;
③将分词结果变成字符串当做fit_transform的输入值;
例:

 
  1.  
    # 分词函数
  2.  
    def cutword():
  3.  
    import jieba
  4.  
    # 分词后的结果是一个迭代器,所以需要将分词后的结果转换成一个列表
  5.  
    con1 = jieba.cut('今天很残酷,明天更残酷,后天很美好,但绝大部分是死在明天晚上,所以每个人不要放弃今天。')
  6.  
    con2 = jieba.cut('我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。')
  7.  
    con3 = jieba.cut('如果只用一种事物了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。')
  8.  
    # 转换成列表
  9.  
    content1 = list(con1)
  10.  
    content2 = list(con2)
  11.  
    content3 = list(con3)
  12.  
    # 把列表转换成字符串
  13.  
    c1 = ' '.join(content1)
  14.  
    c2 = ' '.join(content2)
  15.  
    c3 = ' '.join(content3)
  16.  
    return c1, c2, c3
  17.  
    def hanzivec():
  18.  
    # 中文特征值化
  19.  
    c1, c2, c3 = cutword()
  20.  
    print(c1,c2,c3)
  21.  
    cv = CountVectorizer()
  22.  
    data = cv.fit_transform([c1,c2,c3])
  23.  
    # print(data) # 在每篇文章中统计词的出现次数【单个字母不统计】
  24.  
    print(cv.get_feature_names()) # 统计文章中出现一次及一次以上的词
  25.  
    print(data.toarray())
  26.  
    hanzivec()
 

6> 用途
count:文本分类、情感分析
补:☆ TF-IDF ☆
文本分类的另一种方式:tf idf(tf:term frequency; idf: 逆文档频率inverse document frequency log(总文档数量/该词出现的文档数量))
tf * idf为这个词在文章中的重要程度
主要思想:如果一个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或短语具有很好的类别区分能力,适合用来分类。
作用:用于评估一个字词对于一个文件或一个语料库中的其中一份文件的重要程度
类:sklearn.feature_extraction.text.TfidVectorizer
例:

 
  1.  
    def hanzivec():
  2.  
    from sklearn.feature_extraction.text import TfidfVectorizer
  3.  
    # 中文特征值化
  4.  
    c1, c2, c3 = cutword()
  5.  
    print(c1,c2,c3)
  6.  
    tf = TfidfVectorizer()
  7.  
    data = tf.fit_transform([c1,c2,c3])
  8.  
    # print(data) # 在每篇文章中统计词的出现次数【单个字母不统计】
  9.  
    print(tf.get_feature_names()) # 统计文章中出现一次及一次以上的词
  10.  
    print(data.toarray())
  11.  
    hanzivec()
  12.  
    # 在结果中取较大的一两个值拼起来就是文章的关键词或区分词
 

为什么需要TfidVectorizer?
它是分类及其学习算法的重要依据;在情感分析中也非常重要
5、特征的预处理:对数据进行处理
(特征处理的方法、sklearn特征处理API)
1> 什么是特征处理
通过特定的统计方法(数学方法)数据转换成算法要求的数据
对于数值型数据:标准缩放:①归一化;②标准化;③缺失值
对于类别型数据:one-hot编码
对于时间类型数据:时间的切分
2> sklearn特征预处理API:sklearn.preprocessing
①归一化
i、特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
ii、公式:x'=(x-min)/(max-min), x''=x'*(mx-mi)+mi
(注:作用于每一列,max为一列的最大值,min为一列的最小值,x''为最终结果,mx, mi分别为指定区间值默认mx为1,mi为0)
iii、sklearn归一化API:sklearn.preprocessing.MinMaxScaler
iv、MinMaxScaler语法:

 
  1.  
    MinMaxScaler(feature_range=(0,1)...)
  2.  
    # 每个特征值缩放到给定范围(默认为[0,1])
  3.  
    # MinMaxScaler.fit_transform(x),其中x为numpy array格式的数据[n_samples,n_features]; 返回值为转换后的形状相同的array
 

v、归一化步骤及实例
步骤:实例化MinMaxScaler----->通过fit_transform转换
例:

 
  1.  
    from sklearn.preprocessing import MinMaxScaler
  2.  
    def mm():
  3.  
    mm = MinMaxScaler(feature_range=(2,5))
  4.  
    data = mm.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
  5.  
    print(data)
  6.  
    mm()
  7.  
    # 结果为:
  8.  
    # [[5. 2. 2. 2. ]
  9.  
    # [2. 5. 5. 4.5]
  10.  
    # [3.5 3.5 3.8 5. ]]
 

vi、为什么进行归一化处理
消除量纲,把所有数据转换到同一标准下,使得一个特征对最终结果不会造成更大影响。如:(72993-35948)^2+(10.14-6.8)^2+(1.0-1.21)^2中由于第一项值太大,后两项结果可以忽略不计,所以需要进行归一化处理。


问题:如果数据中异常点较多,会有什么影响?
答:会影响最大值最小值,从而进一步影响归一化的处理。


vii、归一化总结
(归一化的缺点是受异常值的影响)所以只适用于传统精确小数据场景
②标准化
i、特点:通过对原始数据进行变换把数据变换到均值为9,方差为1范围内
ii、公式:x'=(x-mean)/sigama
iii、sklearn标准化API:sklearn.preprocessing.StandardScaler
iv、StandardScaler语法:

 
  1.  
    StandardScaler()
  2.  
    # 处理之后的每列数据都集中在均值为0,方差为1的周围
  3.  
    StandardScaler.fit_transfrom(x) # 其中x为numpy array格式的数据[n_samples,n_features],返回值:转换后的形状相同的array
  4.  
    StandardScaler.mean_ # 原始数据中每列特征的均值
  5.  
    StandardScaler.var_ # 原始数据每列特征的方差
 

v、标准化流程和实例
流程: ①实例化StandScaler
②通过fit_transfrom转换
例:

 
  1.  
    from sklearn.preprocessing import StandardScaler
  2.  
    def stand():
  3.  
    # 标准化缩放
  4.  
    std = StandardScaler()
  5.  
    data = std.fit_transform([[1,-1,3],[2,4,2],[4,6,-1]])
  6.  
    print(data)
  7.  
    print(std.var_)
  8.  
    stand()
  9.  
    # 结果为:
  10.  
    # [[-1.06904497 -1.35873244 0.98058068]
  11.  
    # [-0.26726124 0.33968311 0.39223227]
  12.  
    # [ 1.33630621 1.01904933 -1.37281295]]
  13.  
    # [1.55555556 8.66666667 2.88888889]
 

vi、标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
③缺失值
如何处理数据中的缺失值?
答:常用的方法有:i、删除;ii、插补:按每行或每列的均值或中位数填补。
i、sklearn缺失值API:Imputer
ii、Imputer语法

 
  1.  
    Imputer(missing_values='NaN',strategy='mean',axis=0) # 0为按列进行填补,1为按行进行填补
  2.  
    # 完成缺失值插补
  3.  
    Imputer.fit_transfrom(x)
  4.  
    # x:numpy array格式数据[n_samples,n_features]
  5.  
    # 返回值:转换后的形状相同的array
 

(四)数据降维(减少特征的数量)
常用的方法有两种:特征选择、主成分分析
1、特征选择
特征选择的原因:
冗余:部分特征的相关度高,容易消耗计算性能
噪声:部分特征对预测结果有影响
1> 特征选择是什么
特征选择就是单纯的从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值或不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
主要方法(三大武器):
Filter(过滤式):Variance Threshold
Embedded(嵌入式):正则化、决策树
Wrapper(包裹式)
2> sklearn特征选择API:sklearn.feature_selection.VarianceThreshold
VarianceThreshold语法:

 
  1.  
    VarianceThreshold(threshold=0.0) # 删除所有低方差特征
  2.  
    Variance.fit_transfrom(x)
  3.  
    # 其中x为numpy array格式的数据[n_samples,n_features]; 返回值为训练集差异低于threshold的特征将被删除;默认值是保留所有非零方差特征,即剔除所有样本中具有相同的特征
 

VarianceThreshold流程:
①初始化VarianceThreshold,指定阈值方差
②调用fit_transfrom
例:

 
  1.  
    from sklearn.feature_selection import VarianceThreshold
  2.  
    # 特征选择,删除低方差的特征
  3.  
    x = [[0,2,0,3],[0,1,4,3],[0,1,1,3]]
  4.  
    selector = VarianceThreshold(threshold=0)
  5.  
    data = selector.fit_transfrom(x)
  6.  
    print(data)
  7.  
    # 结果为:
  8.  
    # array([[2, 0],
  9.  
    [1, 4],
  10.  
    [1, 1]]) # 删除了第一列和第四列
 

3> 其他特征选择方法: 神经网络
2、主成分分析(PCA)
1> API:sklearn.decomposition
2> 目的:尽可能损失少量数据信息的情况下,降低数据维度
3> 什么时候用主成分分析法
特征数量达到上百的时候,就要考虑数据的简化问题,数据也会去改变
4> 作用:削减聚类分析或回归分析中特征的数量
5> 语法

 
  1.  
    PCA(n_components=None) # n_components为小数时表示要保留多少的原信息,取值在0-1之间
  2.  
    PCA.fit_transfrom(x)
  3.  
    # 其中x为numpy array格式数据;返回值为转换后指定维数的array
 

例:

 
  1.  
    from sklearn.decomposition import PCA
  2.  
    def pca():
  3.  
    # 主成分分析进行降维
  4.  
    pca = PCA(n_components=0.9)
  5.  
    data = pca.fit_transform([[2,8,4,5],[6,3,0,8],[5,4,9,1]])
  6.  
    print(data)
  7.  
    pca()
  8.  
    # 结果为:
  9.  
    # [[ 1.28620952e-15 3.82970843e+00]
  10.  
    [ 5.74456265e+00 -1.91485422e+00]
  11.  
    [-5.74456265e+00 -1.91485422e+00]]
 

例1:instacart-market-basket-analysis-kaggle
探究:用户对物品类别的喜好细分降维
数据:products.csv(商品信息)、order_products_prior.csv(订单与商品信息)、orders.csv(用户的订单信息)、asile.csv(商品所属具体物品分类)
分析:
①先把有用的特征从各个表中提取出来并放在一张表内[pd.merge()];
prior:product_id, order_id
products:product_idaisle_id
orders: order_iduser_id
aisles: aisle_id, aisle

 
  1.  
    import pandas as pd
  2.  
    from sklearn.decomposition import PCA
  3.  
    # 读取四张表的数据
  4.  
    prior = pd.read_csv('E:/python/传智播客黑马18年人工智能课程/数据文档/instacart-market-basket-analysis-kaggle/order_products__prior.csv')
  5.  
    products = pd.read_csv('E:/python/传智播客黑马18年人工智能课程/数据文档/instacart-market-basket-analysis-kaggle/products.csv')
  6.  
    orders = pd.read_csv('E:/python/传智播客黑马18年人工智能课程/数据文档/instacart-market-basket-analysis-kaggle/orders.csv')
  7.  
    aisle = pd.read_csv('E:/python/传智播客黑马18年人工智能课程/数据文档/instacart-market-basket-analysis-kaggle/aisles.csv')
  8.  
    # 合并四张表到一张表内 用户-物品类别
  9.  
    _mg = pd.merge(prior,products,on=['product_id','product_id']) # 输入要合并的表和表间联系的键
  10.  
    _mg = pd.merge(_mg,orders,on=['order_id','order_id'])
  11.  
    mt = pd.read_csv(_mg,aisle,on=['aisle_id','aisle_id'])
  12.  
    mt.head(10)
 

②建立一个类似行、列数据——交叉表(特殊的分组表)

 
  1.  
    _mg = pd.merge(prior, products, on=['product_id', 'product_id']) # 输入要合并的表和表间联系的键
  2.  
    _mg = pd.merge(_mg, orders, on=['order_id', 'order_id'])
  3.  
    mt = pd.read_csv(_mg, aisle, on=['aisle_id', 'aisle_id'])
  4.  
    print(mt.head(10))
  5.  
    # 交叉表(特殊的分组工具)
  6.  
    cross = pd.crosstab(mt['user_id'],mt['aisle'])
  7.  
    print(cross.head(10))
  8.  
    # 进行主成分分析
  9.  
    pca = PCA(n_components=0.9)
  10.  
    data = pca.fit_transfrom(cross)
  11.  
    print(data)
  12.  
    print(data.shape)
 

注:本文非原创,摘录于传智机器学习视频,仅供个人学习使用,如有侵权,请及时联系删帖。 


---------------------
作者:xiaotian127
来源:CSDN
原文:https://blog.csdn.net/xiaotian127/article/details/86756402#comments
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值