python_ML
1.机器学习概述
机器学习简介
-
祖师爷
- 艾伦.图灵,人工智能之父。其最大的成就就是图灵测试。一个人和一个机器跟你去聊天,你不知道对方是人还是机器,如果经过聊天后,你分辨不出谁是人谁是机器则说明这个机器通过了图灵测试。
-
人工智能和机器学习的区别?
- 机器学习是实现人工智能必要的一种技术手段
-
什么是机器学习?
- 官方解释:
- 机器学习就是从【数据】中自动分析获得【规律(模型)】,并利用规律对未知数据进行【预测】。
- 官方解释:
-
bobo的解释
- 算法模型:
- 特殊的对象。该对象内部已经集成封装好了某种还没有求出解的方程
- 模型的作用:
- 预测
- 分类
- 模型内部方程最终求出的解就是分类或者预测的结果
- 样本数据:
- 训练模型:
- 样本数据就是要带入到算法模型中,将其内部的方程进行求解操作,一旦求出了解,解就是模型最终预测或者分类的结果。
- 样本数据的组成:
- 特征数据:自变量
- 一般为多维
- 目标数据:因变量
- 一般为一维或者低维
- 特征数据:自变量
- 训练模型:
- 模型的分类:
- 有监督学习:
- 如果模型使用的样本数据必须包含特征数据和目标数据则该模型为有监督学习分类的模型
- 无监督学习:
- 模型使用的样本数据只需要有特征数据即可
- 有监督学习:
- 算法模型:
In [ ]:
面积 楼层 采光率 售价
100 3 78% 100w
120 1 33% 78w
-
样本数据(数据集)的载体:
- 通常情况下样本数据都不会存储在数据库中,而是存储在文件中(csv文件)
- 数据库存储数据存在的问题:
- 性能瓶颈:数据量级大的数据很难存储和进行高效的读写。
- 数据存储格式不符合机器学习要求的数据格式
-
样本数据的获取途径:
- kaggle
- UCI数据集:是一个常用的机器学习标准测试数据集,是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库
- sklearn
-
为什么需要机器学习
- 解放生产力:比如智能客服(不知疲倦24小时工作,还不用支付其工资)可以代替人工客服。
- 解决专业问题:比如医疗方面的【ET医疗】,可以辅助医生进行相关症状的判断,数据显示,人类医生的平均准确率为60%-70%,而当下算法的准确率已经达到85%。
- 提供社会便利:杭州的城市大脑,无人超市等等。
-
机器学习的价值体现
- 价值体现在各个方面:医疗,航空,教育,物流,电商......
- 让机器学习程序替换手动的步骤,减少企业的成本也提高企业的效率。
- 例子:汽车销售在对新车进行推广的时候,一般都是将宣传手册投放给了所有的客户,从中进行目标客户的定位。但是如果使用机器学习对客户进行指定分类,然后将手册可以根据分类投放到不同类别的客户中,则这样就大大增加了商业机会。
2.特征工程
特征工程
-
特征抽取
-
数据特征的预处理
-
数据的降维
-
为什么需要特征工程
- 样本数据中的特征有可能会存在缺失值,重复值,异常值等等,那么我们是需要对特征中的相关的噪点数据进行处理的,那么处理的目的就是为了营造出一个更纯净的样本集,让模型基于这组数据可以有更好的预测能力。当然特征工程不是单单只是处理上述操作!
- 比如AlphaGo学习的数据中既有棋谱,又有食谱还有歌词,那么一些干扰的数据绝对会影响AlphaGo的学习。
-
什么是特征工程
- 特征工程是将原始数据转换为更好的代表预测模型的潜在问题的特征的过程,从而提高对未知数据预测的准确性。
-
特征工程的意义
- 直接影响模型预测的结果
-
如何实现特征工程
- 工具:sk-learn
-
sklean介绍
- 是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,其文档完善,容易上手。
- 功能:
- 分类模型
- 回归模型
- 聚类模型
- 特征工程
特征抽取
-
目的:
- 我们所采集到样本中的特征数据往往很多时候为字符串或者其他类型的数据,我们知道电脑只可以识别二进制数值型的数据,如果把字符串给电脑,电脑是看不懂的。机器学习学习的数据如果不是数值型的数据,它是识别不了的。
-
效果演示:
- 将字符串转换成数字
In [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())
[[0 1 1 0 1 1 1 0]
[1 1 1 1 0 1 0 1]]
- 演示后的结论:
- 特征抽取对文本等数据进行特征值化。特征值化是为了让机器更好的理解数据。
字典特征抽取
- 作用:对字典数据进行特征值化
- API:from sklearn.feature_extraction import DictVectorizer
- fit_transform(X):X为字典或者包含字典的迭代器,返回值为sparse矩阵
- inverse_transform(X):X为sparse矩阵或者array数组,返回值为转换之前的数据格式
- get_feature_names():返回类别名称
In [11]:
from sklearn.feature_extraction import DictVectorizer
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d = DictVectorizer() #构造方法使用的是默认参数
#将字典进行特征抽取:将字典中的非数值型的数据进行特征值化
result = d.fit_transform(alist) #特征值化
print(d.get_feature_names())
print(result)#result表示的是一个sparse矩阵
['city=BeiJing', 'city=GZ', 'city=SH', 'temp']
(0, 0) 1.0
(0, 3) 33.0
(1, 1) 1.0
(1, 3) 42.0
(2, 2) 1.0
(2, 3) 40.0
- 什么是sparse矩阵如何理解?
- 在DictVectorizer类的构造方法中中设定sparse=False则返回的就不是sparse矩阵,而是一个数组。
- get_feature_names():返回类别名称
- sparse矩阵就是一个变相的数组或者列表,目的是为了节省内存
- 在DictVectorizer类的构造方法中中设定sparse=False则返回的就不是sparse矩阵,而是一个数组。
In [7]:
from sklearn.feature_extraction import DictVectorizer
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d = DictVectorizer(sparse=False) #进行特征值化后返回的不是sparse矩阵,而是一个数组
#将字典进行特征抽取:将字典中的非数值型的数据进行特征值化
result = d.fit_transform(alist) #特征值化
print(d.get_feature_names())
print(result)#result返回的就是一个数组
['city=BeiJing', 'city=GZ', 'city=SH', 'temp']
[[ 1. 0. 0. 33.]
[ 0. 1. 0. 42.]
[ 0. 0. 1. 40.]]
In [12]:
print(d.inverse_transform(result))
[{'city=BeiJing': 1.0, 'temp': 33.0}, {'city=GZ': 1.0, 'temp': 42.0}, {'city=SH': 1.0, 'temp': 40.0}]
-
OneHot编码
- sparse矩阵中的0and1就是onehot编码
-
为什么需要onehot编码呢?
- 特征抽取主要目的就是对非数值型的数据进行特征值化!如果现在需要对下图中的human和alien进行手动特征值化Alien为4,human为1。则1和4有没有优先级或者权重大小之分呢?
- 则就需要对其进行One-Hot编码:
-
基于pandas实现one-hot编码
- pd.get_dummies(df['col'])
In [13]:
import pandas as pd
df = pd.DataFrame([
['green', 'M', 20, 'class1'],
['red', 'L', 21, 'class2'],
['blue', 'XL',30, 'class3']])
df.columns = ['color', 'size', 'weight', 'class label']
df
Out[13]:
color | size | weight | class label | |
---|---|---|---|---|
0 | green | M | 20 | class1 |
1 | red | L | 21 | class2 |
2 | blue | XL | 30 | class3 |
In [14]:
pd.get_dummies(df['color'])
Out[14]:
blue | green | red | |
---|---|---|---|
0 | 0 | 1 | 0 |
1 | 0 | 0 | 1 |
2 | 1 | 0 | 0 |
In [ ]:
文本特征抽取
- 作用:对文本数据进行特征值化
- API:from sklearn.feature_extraction.text import CountVectorizer
- fit_transform(X):X为文本或者包含文本字符串的可迭代对象,返回sparse矩阵
- inverse_transform(X):X为array数组或者sparse矩阵,返回转换之前的格式数据
- get_feature_names()
- toarray():将sparse矩阵换成数组
In [15]:
from sklearn.feature_extraction.text import CountVectorizer
- 中文文本特征抽取
- 对有标点符号的中文文本进行特征抽取
In [23]:
text_list = ['你猜我猜你猜不猜','我非常喜欢吃中餐']
c = CountVectorizer()
#使用实例化好的对象进行特征值化
result = c.fit_transform(text_list)
print(c.get_feature_names())
print(result) #返回的是sparse矩阵
['你猜我猜你猜不猜', '我非常喜欢吃中餐']
(0, 0) 1
(1, 1) 1
In [19]:
text_list = ['你猜 我 猜你 猜不猜','我 非常 喜欢 吃 中餐']
c = CountVectorizer()
#使用实例化好的对象进行特征值化
result = c.fit_transform(text_list)
print(c.get_feature_names())
print(result) #返回的是sparse矩阵
['中餐', '你猜', '喜欢', '猜不猜', '猜你', '非常']
(0, 3) 1
(0, 4) 1
(0, 1) 1
(1, 0) 1
(1, 2) 1
(1, 5) 1
In [68]:
text_list = ['你猜 我 猜你 猜不猜','我 非常 非常 喜欢 吃 中餐']
c = CountVectorizer()
#使用实例化好的对象进行特征值化
result = c.fit_transform(text_list)
print(c.get_feature_names())
print(result) #返回的是sparse矩阵
['中餐', '你猜', '喜欢', '猜不猜', '猜你', '非常']
(0, 3) 1
(0, 4) 1
(0, 1) 1
(1, 0) 1
(1, 2) 1
(1, 5) 2
- 对有标点符合且有空格分隔的中文文本进行特征处理
In [22]:
text_list = ['你猜,我,猜你 猜不猜','我,非常:喜欢 吃 中餐']
c = CountVectorizer()
#使用实例化好的对象进行特征值化
result = c.fit_transform(text_list)
print(c.get_feature_names())
print(result) #返回的是sparse矩阵
['中餐', '你猜', '喜欢', '猜不猜', '猜你', '非常']
(0, 3) 1
(0, 4) 1
(0, 1) 1
(1, 0) 1
(1, 2) 1
(1, 5) 1
-
目前CountVectorizer只可以对有标点符号和用分隔符对应的文本进行特征抽取,显然这是满足不了我们日常需求的:
- 因为在自然语言处理中,我们是需要将一段中文文本中相关的词语,成语,形容词......都要进行抽取的
-
jieba分词
- 对中文文章进行分词处理
- pip install jieba
-
jieba分词的基本使用
In [30]:
import jieba
jb = jieba.cut('你到底有没有听我说话?')
jb_list = list(jb)
centense = ' '.join(jb_list)
print(centense)
你 到底 有没有 听 我 说话 ?
In [40]:
c1 = CountVectorizer()
result = c1.fit_transform([centense])
print(c1.get_feature_names())
print(result.toarray())
['到底', '有没有', '说话']
[[1 1 1]]
In [42]:
#测试应用
text_1 = '在承接万达商业的全部地产业务后,万达地产集团已经悄然做大,在大开大合进行布局后,万达地产近期也做了些调整'
text_2 = '界面新闻独家获悉,近期万达地产将中区拆分,南京并至北区,杭州并至南区。'
text_3 = '目前,万达地产集团核心管理层为,总裁吕正韬,副总裁兼北区项目管理中心总经理黄国斌,地产集团副总裁兼北区项目管理中心总经理曲晓东。'
#分词
text_1_list = list(jieba.cut(text_1))
text_2_list = list(jieba.cut(text_2))
text_3_list = list(jieba.cut(text_3))
centence_1 = ' '.join(text_1_list)
centence_2 = ' '.join(text_2_list)
centence_3 = ' '.join(text_3_list)
co = CountVectorizer()
result = co.fit_transform([centence_1,centence_2,centence_3])
print(co.get_feature_names())
print(result.toarray())
['万达', '业务', '中区', '中心', '做大', '全部', '北区', '南京', '南区', '吕正', '商业', '地产', '大开大合', '已经', '布局', '总经理', '总裁', '总裁兼', '悄然', '承接', '拆分', '新闻', '曲晓东', '杭州', '核心', '独家', '界面', '目前', '管理层', '获悉', '调整', '近期', '进行', '集团', '项目管理', '黄国斌']
[[3 1 0 0 1 1 0 0 0 0 1 3 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0]
[1 0 1 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 0 0 1 0 1 0 0 0 0]
[1 0 0 2 0 0 2 0 0 1 0 2 0 0 0 2 1 2 0 0 0 0 1 0 1 0 0 1 1 0 0 0 0 2 2 1]]
特征的预处理:对数值型的数据进行处理
-
含义:特征抽取后我们就可以获取对应的数值型的样本数据啦,然后就可以进行数据处理了。
-
概念:通过特定的统计方法(数学方法),将数据转换成算法要求的数据
-
方式:
- 归一化
- 标准化
-
案例分析:
-
如果认为每一个特征具有同等大小的权重都同等重要,则必须要对其进行归一化处理。
-
可以使用KNN的算法对特征影响进行说明!!
-
归一化的实现:
-
API:from sklearn.preprocessing import MinMaxScaler
- 参数:feature_range表示缩放范围,通常使用(0,1)
-
作用:使得某一个特征对最终结果不会造成很大的影响
In [45]:
alist = [[1111,2,0.1],[2222,5,0.3],[3333,6,0.2],[4444,8,0.7]]
alist
Out[45]:
[[1111, 2, 0.1], [2222, 5, 0.3], [3333, 6, 0.2], [4444, 8, 0.7]]
In [48]:
from sklearn.preprocessing import MinMaxScaler
m = MinMaxScaler()
m.fit_transform(alist)
Out[48]:
array([[0. , 0. , 0. ],
[0.33333333, 0.5 , 0.33333333],
[0.66666667, 0.66666667, 0.16666667],
[1. , 1. , 1. ]])
-
问题:如果数据中存在的异常值比较多,会对结果造成什么样的影响?
- 结合着归一化计算的公式可知,异常值对原始特征中的最大值和最小值的影响很大,因此也会影响对归一化之后的值。这个也是归一化的一个弊端,无法很好的处理异常值。
-
归一化总结:
- 在特定场景下最大值和最小值是变化的,另外最大最小值很容易受到异常值的影响,所以这种归一化的方式具有一定的局限性。因此引出了一种更好的方式叫做:标准化!!!
-
标准化的处理
- 处理后,每列所有的数据都聚集在均值为0,标准差为1范围附近 - 从公式中可以看出,异常值对均值和标准差的影响不大
-
归一化和标准化总结:
- 对于归一化来说,如果出现了异常值则会响应特征的最大最小值,那么最终结果会受到比较大影响
- 对于标准化来说,如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变比较少。
-
API
- 处理后,每列所有的数据都聚集在均值为0,标准差为1范围附近
- 标准化API:from sklearn.preprocessing import StandardScaler
- fit_transform(X):对X进行标准化
- mean_:均值
- var_:方差
In [56]:
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
print(s.fit_transform(alist))
[[-1.34164079 -1.5011107 -0.98787834]
[-0.4472136 -0.11547005 -0.10976426]
[ 0.4472136 0.34641016 -0.5488213 ]
[ 1.34164079 1.27017059 1.6464639 ]]
- 标准化总结:
- 在已有足够多的样本下比较稳定,适合现在嘈杂的大数据场景【推荐使用】
数据降维
-
该维度表示的不是数组的维度,而是特征的数量。比如一个样本有4个特征,则该样本的维度为4。
- 图中表示将三维特征降低为2维特征
-
降维的方式:
- 特征选择
- 主成分分析
In [ ]:
楼层 面积 采光率 高度 人口数量 长相 售价
特征选择:从特征中选择部分的特征作为最终的机器学习输入的数据!
-
特征选择的原因:
- 冗余:部分特征的相关度高,容易消耗计算机的性能(在主成分分析时解释)
- 噪点:部分特征对预测结果有偏执影响
-
特征选择的实现:
- 人为对不相关的特征进行主观舍弃
- 在已有特征和对应预测结果的基础上,使用相关的工具过滤掉一些无用或权重较低的特征
- 工具:
- Filter(过滤式)【主要讲解】
- Embedded(嵌入式):正则化,决策树。【后期在讲解模型的时候在补充】
- 工具:
-
Filter过滤式:
- 原理:主要是根据基于特征列的方差来决定是否将该特征进行舍弃。因为方差的大小表示特征值和平均值的偏离度。方差越小表示特征列中特征的变化幅度小,则该特征往往对预测结果的影响较小。
- API:from sklearn.feature_selection import VarianceThreshold
- VarianceThreshold(threshold=x)threshold方差的值,删除所有方差低于x的特征,默认值为0表示保留所有方差为非0的特征
- fit_transform(X)#:X为特征
In [60]:
from sklearn.feature_selection import VarianceThreshold #使用过滤式实现特征选择
v = VarianceThreshold(threshold=2)
v.fit_transform(alist)
Out[60]:
array([[1.111e+03, 2.000e+00],
[2.222e+03, 5.000e+00],
[3.333e+03, 6.000e+00],
[4.444e+03, 8.000e+00]])
主成分分析PCA:是一种分析,简化数据集的技术
-
思想:如何最好的对一个立体的物体用二维表示!
-
当然,第四张二维图片可以比较好的标识一个立体三维的水壶。但是也要清楚,用一个低纬度去表示高纬度的物体时,一定会造成一些信息的差异。可以让低纬度也可以能正确的表示高纬度的事物,或者信息差异最小。
-
目的:特征数量达到上百,上千的时候,考虑数据的优化。使数据维度压缩,尽可能降低源数据的维度(复杂度),损失少量信息。
-
作用:可以削减回归分析或者聚类分析中特征的数量
-
PCA大致原理:协方差矩阵
-
红色为原始的样本特征,为二维的特征,如果降为一维,则可以将5个红色的原始特征,映射到一维的线段上就变成了4个特征。
-
PCA语法
- from sklearn.decomposition import PCA
- pca = PCA(n_components=None)
- n_components可以为小数(保留特征的百分比),整数(减少到的特征数量)
- pca.fit_transform(X)
In [62]:
alist
Out[62]:
[[1111, 2, 0.1], [2222, 5, 0.3], [3333, 6, 0.2], [4444, 8, 0.7]]
In [67]:
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
result = pca.fit_transform(alist)
print(result)
[[ 1.66650314e+03 -3.95477823e-01]
[ 5.55499613e+02 7.02545532e-01]
[-5.55500445e+02 -2.18656506e-01]
[-1.66650230e+03 -8.84112038e-02]]
3.机器学习基础
sklearn的数据集
- 数据集划分
- 数据集接口介绍
数据集划分
- 前提:机器学习就是从数据中自动分析获得规律,并利用规律对未知数据进行预测。换句话说,我们的模型一定是要经过样本数据对其进行训练,才可以对未知数据进行预测的。
- 问题:我们得到数据后,是否将数据全部用来训练模型呢?
- 当然不是!因为我们如果模型(数据的规律)都是从数据中得来的,那么该模型的性能评估如何进行呢?还是基于对原先的数据进行预测吗?可想不是的,如果模型对原先的数据进行预测,由于模型(数据的规律)本来就是从该数据中获取的,所以预测的精度几乎会是百分之百。所以想要评估模型的好坏,需要使用一组新数据对模型进行评估。
- 因此我们需要将原先的样本数据拆分成两部分:
- 训练集:训练模型
- 测试集:评估模型
- 不同类型的模型对应的评估方式是不一样的
- 数据集划分的API
- from sklearn.model_selection import train_test_split
- train_test_split(x,y,test_size,random_state)参数介绍:
- x:特征
- y:目标
- test_size:测试集的比例
- random_state:打乱的随机种子
- 返回值:训练特征,测试特征,训练目标,测试目标
数据集接口介绍
- sklearn.datasets.load_*():获取小规模的数据集
- sklearn.datasets.fetch_*(data_home=None,subset):获取大规模的数据集data_home表示数据集下载目录,None为默认值表示的是家目录/scikit_learn_data(自动创建该文件夹)下。需要从网络下载.subset为需要下载的数据集,可以为train,test,all
In [ ]:
In [16]:
#datasets
import sklearn.datasets as datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
feature = iris.data
target = iris.target
train_x,test_x,train_y,test_y = train_test_split(feature,target,test_size = 0.2,random_state = 33)
In [ ]:
#fetch大数据集
datasets.fetch_20newsgroups()
Downloading 20news dataset. This may take a few minutes.
Downloading dataset from https://ndownloader.figshare.com/files/5975967 (14 MB)
机器学习基础
-
机器学习开发流程
-
机器学习算法分类
-
机器学习模型是什么
-
事前需要明确的几点:
- 机器学习最终进行预测出来的结果其实都是通过相关的算法计算出来的结果!所以说在机器学习中算法是核心,数据是计算的基础。
- 找准定位:大部分复杂模型的算法设计都是算法工程师(博士,硕士)在做,而我们只需要:
- 学会分析问题,使用机器学习相关算法完成对应的需求
- 掌握算法的基本思想,学会对不同问题选择对应的算法去解决
- 学会利用框架和库解决问题
机器学习中的数据类型
-
观察下图中的两组数据的不同!
-
机器学习中的数据类型分为:
- 离散型数据:
- 由记录不同类别个体的数目所得到的数据,又称为计数数据。所以这些数据全部都是整数,而且不能在细分,也不能进一步提高它们的精确度。比如,特定范围的汽车数量计数为多少就是多少,不可细分,不可提高计数的精确度。
- 连续型数据:
- 变量可以在某一范围内取得的任意一数,即变量的取值是连续的。比如长度,时间,质量等数据。这些数据通常为非整数,含小数的数据。
- 注意:离散型是区间不可分的,而连续型是区间可分的。
- 离散型数据:
数据类型的不同应用
-
图像识别,然机器区分图像到底是猫还是狗?
-
文章分类,让机器对不同文章进行分类!
-
票房预测,让机器预测下个月的票房!
-
测试:下属问题的类别应该是什么?
- 预测明天的气温
- 预测明天的晴天还是阴天
- 人脸识别
机器学习开发流程
- 1.数据采集
- 公司内部产生的数据
- 和其他公司合作获取的数据
- 购买的数据
- 2.分析数据所对应要解决需求或者问题是什么?根据目标数据推断问题属于回归还是分类!
- 3.数据的基本处理
- 数据清洗
- 合并
- 级联等
- 4.特征工程:对特征进行处理
- 特征抽取
- 特征预处理
- 降维等
- 5.选择合适的模型,然后对其进行训练
- 6.模型的评估
- 7.上线使用