目录
2、为什么需要特征工程(Feature Engineering)
1.1包括将任意数据(如文本或图像)转换为可用于机器学习的数字特征
2.1应用
机器学习概述
了解机器学习定义以及应用场景
什么是机器学习
1、 背景介绍
2、定义
机器学习是从数据中自动分析获得规律(模型),并利用规律对未知数据进行预测
3、解释
为什么需要机器学习
- 解放生产力:
- 智能客服:不知疲倦24小时小时作业
- 量化投资:避免更多的交易人员
- 解决专业问题:
- 医疗:帮助医生辅助医疗
- 提供便利:
- 阿里ET城市大脑:智能城市
机器学习应用场景
机器学习的应用场景非常多,可以说渗透到了各个行业领域当中。医疗、航空、教育、物流、电商等等领域的各种场景。
-
用在挖掘、预测领域:
- 应用场景:店铺销量预测、量化投资、广告推荐、企业客户分类、SQL语句安全检测分类…
-
-
-
用在图像领域:
- 应用场景:街道交通标志检测、图片商品识别检测等等
-
用在自然语言处理领域:
- 应用场景:文本分类、情感分析、自动聊天、文本检测等等
当前重要的是掌握一些机器学习算法等技巧,从某个业务领域切入解决问题。
学习框架和资料介绍
1、学习框架
2、书籍资料
3、提深内功(但不是必须)
特征工程介绍
学习目标
- 目标
- 说出机器学习的训练数据集结构组成
- 了解特征工程在机器学习当中的重要性
- 知道特征工程的分类
- 应用
- 无
问题:从历史数据当中获得规律?这些历史数据是怎么的格式?
1、数据集的构成
1.1 可用数据集
1.2 数据集构成
- 结构:特征值+目标值
注:有些数据集可以没有目标值,对于每一行数据我们可以称之为样本。
为什么需要这样的结构?后面结合机器学习算法去解释
特征工程的位置与Pandas比较?
- pandas:一个数据读取非常方便以及基本的处理格式的工具
- sklearn:对于特征的处理提供了强大的接口
2、为什么需要特征工程(Feature Engineering)
机器学习领域的大神Andrew Ng(吴恩达)老师说“Coming up with features is difficult, time-consuming, requires expert knowledge. “Applied machine learning” is basically feature engineering. ”
注:业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
我们从一个简单的例子理解一下:
3、什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
对于这个概念,不用过多理解,是一个比较模糊广泛的概念
- 意义:直接影响到模型的预测结果
特征工程包含内容
- 特征抽取
- 特征预处理
- 特征选择
- 特征降维
4、特征工程所需工具
4.1Scikit-learn工具介绍
- Python语言的机器学习工具
- Scikit-learn包括许多知名的机器学习算法的实现
- Scikit-learn文档完善,容易上手,丰富的API
- 目前稳定版本0.18
4.2 安装
pip3 install Scikit-learn==0.18
安装好之后可以通过以下命令查看是否安装成功
import sklearn
注:安装scikit-learn需要Numpy,Pandas等库
4.3 Scikit-learn包含的内容
- 分类、聚类、回归
- 特征工程
- 模型选择、调优
特征提取
学习目标
- 目标
- 应用DictVectorizer实现对类别特征进行数值化、离散化
- 应用CountVectorizer实现对文本特征进行数值化
- 应用TfidfVectorizer实现对文本特征进行数值化
- 说出两种文本特征提取的方式区别
- 应用
- 无
什么是特征提取呢?
文本特征提取
字典特征提取
演示案例:特征提取例子演示
1、特征提取
1.1包括将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注:特征值化是为了计算机更好的去理解数据
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习将介绍)
1.2 特征提取API
sklearn.feature_extraction
2、字典特征提取
作用:对字典数据进行特征值化
- sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
- DictVectorizer.get_feature_names() 返回类别名称
2.1应用
我们对以下数据进行特征提取
[{'city': '北京','temperature':100}
{'city': '上海','temperature':60}
{'city': '深圳','temperature':30}]
2.2流程分析
- 实例化类DictVectorizer
- 调用fit_transform方法输入数据并转换(注意返回格式)
def dict_vec():
# 实例化dict
dict = DictVectorizer(sparse=False)
# diaoyong fit_transform
data = dict.fit_transform([{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}])
# 打印每一个列的名称
print(dict.get_feature_names())
print(data)
return None
注意观察没有加上sparse=False参数的结果
这个结果并不是我们想要看到的,所以加上参数,得到想要的结果
我们会议之前在做pandas的离散化时候,也实现了类似的效果,那在这里我们把这个处理数据的技巧用专业的称呼"one-hot"编码,之前我们也解释过为什么需要这种离散化的了,是分析数据的一种手段。比如下面例子:
2.3 总结
对于特征当中存在类别信息的我们都会做one-hot编码处理
3、文本特征提取
作用:对文本数据进行特征值化
-
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
- 返回词频矩阵
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
- CountVectorizer.get_feature_names() 返回值:单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
3.1应用
我们对以下数据进行特征提取
["life is short,i like python",
"life is too long,i dislike python"]
3.2 流程分析
- 实例化类CountVectorizer
- 调用fit_transform方法输入数据并转换 (注意返回格式,利用toarray()进行sparse矩阵转换array数组)
def countvec():
# 实例化conunt
count = CountVectorizer()
data = count.fit_transform(["life is is short,i like python", "life is too long,i dislike python"])
# 内容
print(count.get_feature_names())
print(data.toarray())
return None
问题:如果我们将数据替换成中文?
"人生苦短,我喜欢Python" "生活太长久,我不喜欢Python"
那么最终得到的结果是
为什么会得到这样的结果呢,仔细分析之后会发现英文默认是以空格分开的。其实就达到了一个分词的效果,所以我们要对中文进行分词处理
3.3jieba分词处理
- jieba.cut()
- 返回词语组成的生成器
需要安装下jieba库
pip3 install jieba
3.4 案例分析
对以下三句话进行特征值化
今天很残酷,明天更残酷,后天很美好,
但绝对大部分是死在明天晚上,所以每个人不要放弃今天。
我们看到的从很远星系来的光是在几百万年之前发出的,
这样当我们看到宇宙时,我们是在看它的过去。
如果只用一种方式了解某样事物,你就不会真正了解它。
了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。
- 分析
- 准备句子,利用jieba.cut进行分词
- 实例化CountVectorizer
- 将分词结果变成字符串当作fit_transform的输入值
def cutword():
# 将三个句子用jieba.cut处理
contetn1 = jieba.cut("今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。")
contetn2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。")
contetn3 = jieba.cut("如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
# 先将着三个转换成列表
c1 = ' '.join(list(contetn1))
c2 = ' '.join(list(contetn2))
c3 = ' '.join(list(contetn3))
return c1, c2, c3
def chvec():
# 实例化conunt
count = CountVectorizer(stop_words=['不要', '我们', '所以'])
# 定义一个分词的函数
c1, c2, c3 = cutword()
data = count.fit_transform([c1, c2, c3])
# 内容
print(count.get_feature_names())
print(data.toarray())
return None
请看问题:
该如何处理某个词或短语在多篇文章中出现的次数高这种情况
3.5 Tf-idf文本特征提取
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
3.5.1 公式
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
最终得出结果可以理解为重要程度。
注:假如一篇文件的总词语数是100个,而词语"非常"出现了5次,那么"非常"一词在该文件中的词频就是5/100=0.05。而计算文件频率(IDF)的方法是以文件集的文件总数,除以出现"非常"一词的文件数。所以,如果"非常"一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是lg(10,000,000 / 1,0000)=3。最后"非常"对于这篇文档的tf-idf的分数为0.05 * 3=0.15
3.5.2 案例
def tfidfvec():
# 实例化conunt
tfidf = TfidfVectorizer()
# 定义一个分词的函数
c1, c2, c3 = cutword()
data = tfidf.fit_transform([c1, c2, c3])
# 内容
print(tfidf.get_feature_names())
print(data.toarray())
return None
3.6 Tf-idf的重要性
分类机器学习算法进行文章分类中前期数据处理方式
特征预处理
学习目标
- 目标
- 了解数值型数据、类别型数据特点
- 应用MinMaxScaler实现对特征数据进行归一化
- 应用StandardScaler实现对特征数据进行标准化
- 应用
- 无
什么是特征预处理?
1、什么是特征预处理
# scikit-learn的解释
provides several common utility functions and transformer classes to change raw feature vectors into a representation that is more suitable for the downstream estimators.
翻译过来:通过一些转换函数将特征转换成更加适合算法模型的过程
可以通过上面那张图来理解
1.1 包含内容
- 数值型数据的无量纲化:
- 归一化
- 标准化
1.2 特征预处理API
sklearn.preprocessing
为什么我们要进行归一化/标准化?
- 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
约会对象数据
我们需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格
2、归一化
2.1定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
2.2公式
作用于每一列,max为一列的最大值,min为一列的最小值,那么X’’为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0
那么怎么理解这个过程呢?我们通过一个例子
2.3 API
- sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
- MinMaxScalar.fit_transform(X)
2.4 数据计算
我们对以下数据进行运算
[[90,2,10,40],
[60,4,15,45],
[75,3,13,46]]
- 分析
1、实例化MinMaxScalar
2、通过fit_transform转换
def mm():
"""
对二维数组进行归一化处理
:return:
"""
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
问题:如果数据中异常点较多,会有什么影响?
2.5 归一化总结
注意最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
怎么办?
3、标准化
3.1定义
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
3.2 公式
作用于每一列,mean为平均值,σ为标准差
所以回到刚才异常点的地方,我们再来看看标准化
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
3.3 API
- sklearn.preprocessing.StandardScaler( )
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
- StandardScaler.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
3.4 数据计算
对下面的数据进行计算
[[90,2,10,40],
[60,4,15,45],
[75,3,13,46]]
- 分析
1、实例化StandardScaler
2、通过fit_transform转换
def std():
std = StandardScaler()
data = std.fit_transform([[90,2,10,40],[60,4,15,45],[75,3,13,46]])
print(data)
return None
3.5 标准化总结
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。