文章目录
- 一、人工智能概述
- 二、什么是机器学习
- 三、特征工程
- 3.1 数据集
- 3.2 特征工程
一、人工智能概述
1.机器学习是人工智能的一个实现途径
2.深度学习是由机器学习的一个方法(人工神经网络)发展而来的
3.机器学习,深度学习能做什么
传统预测,图像识别,自然语言处理
二、什么是机器学习
1.机器学习就是从数据中自动分析获取模型,并利用模型对未知数据进行预测
2.数据集构成
数据集由特征值和目标值构成,每一行数据可以称为样本
3.机器学习算法分类
(1)监督学习:
目标值:区分类别—分类问题(区分猫和狗)
- k近邻算法,贝叶斯分类,决策树与随机森林,逻辑回归
目标值:连续性数据—回归问题(预测房价)
- 线性回归,岭回归
(2)无监督学习:
- 目标值:无—无监督学习
- 聚类:k-means
4.机器学习开发流程
(1)获取数据
(2)数据处理(缺失值等)
(3)特征工程(进一步处理,处理为特征值)
(4)机器学习算法训练—模型
(5)模型评估
三、特征工程
3.1 数据集
1.可用数据集
公司内部,政府等有可用数据集
在学习阶段可用的数据集是:
1)sklearn
2)kaggle
3)UCI(加州大学欧文分校收集的数据集)
我使用的是sklearn数据集,在下载完成之后可使用
import sklearn
看是否下载成功
2.使用sklearn数据集
import sklearn.datasets
加载获取流行数据集
(1)获取小规模数据集使用load_()
datasets.load_()
(2)获取大规模数据集使用fetch_()
datasets.fetch_(data_home=None)
需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
3.sklearn中的小数据集
(1)鸢尾花数据集
调用sklearn.datasets.load_iris()方法,返回鸢尾花数据集
(2)波士顿房价数据集
调用sklearn.datasets.load_boston()方法,返回波士顿房价数据集
4.数据集的返回值
使用load和fetch方法返回的数据集的数据类型是datasets.base.Bunch(字典格式)
该字典的key有以下几个
- data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
- target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
- DESCR:数据描述
- feature_names:特征名,新闻数据,手写数字(回归数据集没有)
- target_names:标签名
由于返回的数据集是字典类型,因此可以通过dict[key]访问其中的value
也可以通过"."的方式访问其中的属性值
例:调用sklearn中的鸢尾花数据集并访问其中的属性
'''
本例演示sklearn数据集的基本使用
'''
# 从sklearn中导入鸢尾花数据集
from sklearn.datasets import load_iris
def show():
# 获取鸢尾花数据集
iris = load_iris()
# 查看鸢尾花数据集
print("鸢尾花数据集:")
print(iris)
print('鸢尾花数据集描述:')
print(iris['DESCR'])
print('鸢尾花特征值的名字')
print(iris.feature_names)
print('查看特征值')
print(iris.data)
# 查看数组有几行几列
print(iris.data.shape)
show()
5.数据集的划分
获取的数据不全部用来训练,因此获取到的全部数据分为训练集和测试集
机器学习中的数据集一般会分为两个部分
- 训练集:用于训练,构建模型
- 测试集:在模型检验时使用,用于评估模型是否有效
划分的比例:
训练集:70%~80%
测试集:20%~30%
在sklearn中实现数据集的划分
数据集划分使用的方法:
sklearn.model_selection.train_test_split(arrays, *options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)
# 数据集的划分
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 获取鸢尾花数据集
iris = load_iris()
# 对数据集进行划分
x_train, x_test, y_train, y_test = train_test_split(iris.data,iris.target,test_size=0.3,random_state=22)
# 输出训练集和测试集
print('x数据集的特征值')
print(x_train)
print(x_train.shape)
print('y数据集的特征值')
print(y_train)
print(y_train.shape)
print('x训练集的特征值')
print(x_test)
print(x_test.shape)
print('y测试集的特征值')
print(y_test)
print(y_test.shape)
3.2 特征工程
1.为什么需要特征工程?
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。特征工程可以帮助我们逼近这个上限
2.什么是特征工程?
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
特征工程可以影响机器学习的效果
3.特征工程包含以下几个内容
- 特征抽取
- 特征预处理
- 特征降维
4.什么是特征提取?
特征提取是将任意数据(如文本或图像)转换为可用于机器学习的数字特征
三种特征抽取
- 字典特征提取
- 文本特征提取
- 图像特征提取
在机器学习中主要学习字典特征提取和文本特征提取,在深度学习中学习图像特征提取
5.在sklearn中实现字典特征提取的类
sklearn.feature_extraction
1)字典特征抽取
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
DictVectorizer是一个转换器类,里面有相应的方法,sparse=True表示默认返回稀疏矩阵
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回稀疏矩阵(Sparse)
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
- DictVectorizer.get_feature_names() 返回类别名称
一个小例子
'''
本例演示字典特征抽取
'''
# 1.导包
from sklearn.feature_extraction import DictVectorizer
# 2.引入数据
data = [{'city': '济南','PM2.5':300},{'city': '天津','PM2.5':60},{'city': '重庆','PM2.5':50}]
# 3.实例化转换器类
transfer1 = DictVectorizer()
# 4.调用fit_transform(dict)
data1 = transfer1.fit_transform(data)
# 打印data1
print('data1 =')
'''
这里打印输出以下的稀疏矩阵,稀疏矩阵的特点是将矩阵中非0的值打印出来
(0, 0) 300.0
(0, 2) 1.0
(1, 0) 60.0
(1, 1) 1.0
(2, 0) 50.0
(2, 3) 1.0
'''
print(data1)
# 接下来打印非稀疏矩阵
transfer2 = DictVectorizer(sparse=False)
data2 = transfer2.fit_transform(data)
print('data2 = ')
'''
打印输出矩阵,0表示无数据,1表示有数据
[[300. 0. 1. 0.]
[ 60. 1. 0. 0.]
[ 50. 0. 0. 1.]]
'''
print(data2)
# 数据矩阵对应的特征名
print('特征名字:')
# ['PM2.5', 'city=天津', 'city=济南', 'city=重庆']
print(transfer2.get_feature_names())
2)文本特征抽取
在一篇文章中,我们可以通过单词,字母,短语等作为特征提取的条件
可以使用sklearn库中的如下方法
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
stop_words是停用词,如果我们认为某些词不太重要,可以将其写入数组并传入参数,那么系统就会自动忽略这些词的统计
可以对文本进行特征值化,返回词频矩阵
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
- CountVectorizer.get_feature_names() 返回值:单词列表
可以使用toarray()方法将sparse矩阵转换为二维数组的形式
'''
本例演示文本特征抽取
'''
# 1.导包
from sklearn.feature_extraction.text import CountVectorizer
# 2.数据
data = ["life is is short,i is is like python",
"life is too long python,i dislike dislike python"]
# 3.实例化一个转换器
trasfer = CountVectorizer()
# 4.调用fit_transform方法
newData = trasfer.fit_transform(data)
# 5.打印输出
print("newData:")
print(newData.toarray())
# 打印特征名字
print(trasfer.get_feature_names())
输出结果
newData:
[[0 4 1 1 0 1 1 0]
[2 1 1 0 1 2 0 1]]
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
3)中文文本特征提取
由于中文的语言特性,字与字之间不想英文的词与词之间那样有空格,因此如果直接使用上面的特征提取方式,会出现一句话合为一个词的效果,不符合我们的要求
这里使用了中文分词库jieba
首先需要安装jieba库,可以直接在PyCharm里安装
'''
本例演示中文文本特征抽取
'''
# 1.导包
from sklearn.feature_extraction.text import CountVectorizer
import jieba
# 中文分词的方法
def devideWord(text):
'''
进行中文分词:"我爱北京天安门"->”我 爱 北京 天安门“
:param text:
:return:
'''
text = " ".join(list(jieba.cut(text)))
return text
# 2.数据
data = ["在这个世界上,一星陨落,黯淡不了星空灿烂,一花凋零,荒芜不了整个春天。",
"今天我出去玩了,玩得很开心"]
data_new = []
# 3.使用中文分词
for text in data:
data_new.append(devideWord(text))
# 4.打印输出分词的结果
print(data_new)
# 5.对分词之后的中文文本进行特征提取
trasfer = CountVectorizer()
newData = trasfer.fit_transform(data_new
print("newData:")
print(newData.toarray())
# 打印特征名字
print(trasfer.get_feature_names())
输出结果
['在 这个 世界 上 , 一星 陨落 , 黯淡 不了 星空 灿烂 , 一花 凋零 , 荒芜 不了 整个 春天 。', '今天 我 出去玩 了 , 玩得 很 开心']
newData:
[[1 1 2 1 0 1 0 0 1 1 1 1 0 1 1 1 1]
[0 0 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0]]
['一星', '一花', '不了', '世界', '今天', '凋零', '出去玩', '开心', '整个', '星空', '春天', '灿烂', '玩得', '荒芜', '这个', '陨落', '黯淡']
4)Tf-idf文本特征抽取,TfidfVectorizer
使用这种方法,可以找出在一个文本中哪一个词更重要,即找到关键词
TF-IDF的作用:评估一个字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
- Tf:词频(term frequency):一个词在文章中出现的频率(出现次数 / 总词数)
- idf:逆向文档频率(inverse document frequency):是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
某个词的Tf-idf = Tf * idf
API文档
可以使用sklearn库中的如下方法
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])
可以对文本进行特征值化,返回词频矩阵
- TfidfVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- TfidfVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
- TfidfVectorizer.get_feature_names() 返回值:单词列表
可以使用toarray()方法将sparse矩阵转换为二维数组的形式
'''
本例演示Tfidf文本特征抽取
'''
# 1.导包
from sklearn.feature_extraction.text import TfidfVectorizer
# 2.数据
data = ["life is is short,i is is like python",
"life is too long python,i dislike dislike python"]
# 3.实例化一个转换器
trasfer = TfidfVectorizer()
# 4.调用fit_transform方法
newData = trasfer.fit_transform(data)
# 5.打印输出
print("newData:")
print(newData.toarray())
# 打印特征名字
print(trasfer.get_feature_names())
输出结果
newData:
[[0. 0.85376069 0.21344017 0.29998272 0. 0.21344017
0.29998272 0. ]
[0.66528343 0.23667732 0.23667732 0. 0.33264172 0.47335464
0. 0.33264172]]
['dislike', 'is', 'life', 'like', 'long', 'python', 'short', 'too']
数值越大,说明越重要