机器学习概述
1.1 人工智能概述
- 达特茅斯会议-人工智能的起点
- 机器学习是人工智能的一个实现途径
- 深度学习是机器学习的一个方法发展而来
1.1.2 机器学习、深度学习能做些什么
1.2 什么是机器学习
从历史数据当中获得规律?这些历史数据是怎么的格式?
1.2.3 数据集构成
有的时候可能是没有目标值的:目标特征分类
1.3 机器学习算法分类
监督学习
定义︰输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)
无监督学习
定义∶输入数据是由输入特征值所组成。
- 目标值:无 - 无监督学习
聚类 k-means 例子: 1、预测明天的气温是多少度? 回归 2、预测明天是阴、晴还是雨? 分类 3、人脸年龄预测? 回归/分类 4、人脸识别? 分类
1.4 机器学习开发流程
1)获取数据 2)数据处理 3)特征工程 4)机器学习算法训练 - 模型 5)模型评估 6)应用
1.5 学习框架和资料介绍
1)算法是核心,数据与计算是基础 2)找准定位 大部分复杂模型的算法设计都是算法工程师在做,而我们
- 分析很多的数据
- 分析具体的业务
- 应用常见的算法
- 特征工程、调参数、优化
3)怎么做?
- 入门
- 实战类书籍
-
- 机器学习 -”西瓜书”- 周志华
- 统计学习方法 - 李航
- 深度学习 - “花书”
4)1.5.1 机器学习库与框架
特征工程
2.1 数据集
2.1.1 可用数据集
公司内部 百度 数据接口 花钱 数据集
学习阶段可以用的数据集: 1)sklearn 2)kaggle 3)UCI
Scikit-learn工具介绍
注意: 安装scikit-learn需要Numpy, Scipy等库
错误记录
安装sklearn过慢或出现错误Cannot determine archive format of C:\Users\22164\AppData\Local\Temp\pip-req
解决方案: 更换清华pip源
参考链接:
2.1.2 sklearn数据集
-
sklearn.datasets load_* 获取小规模数据集 fetch_* 获取大规模数据集 -
sklearn小数据集 sklearn.datasets.load_iris() -
sklearn大数据集 sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’) -
数据集的返回值 datasets.base.Bunch(继承自字典) dict[“key”] = values bunch.key = values
思考:拿到的数据是否全部都用来训练一个模型?
2.1.3 数据集的划分
训练数据:用于训练,构建模型 测试数据:在模型检验时使用,用于评估模型是否有效
测试集 20%~30% sklearn.model_selection.train_test_split(arrays, *options)
训练集特征值,测试集特征值,训练集目标值,测试集目标值 x_train, x_test, y_train, y_test
示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_test():
"""sklearn数据集使用"""
iris = load_iris()
print("鸢尾花数据集:\n", iris)
print("查看数据集描述:\n", iris.DESCR)
print("查看特征值名字:\n", iris.feature_names)
print("查看特征值:\n", iris.data, iris.data.shape)
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("查看训练集特征值:\n", x_train, x_train.shape)
2.2 特征工程介绍
算法 特征工程
2.2.1 为什么需要特征工程(Feature Engineering)
2.2.2 什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果
sklearn 特征工程 pandas 数据清洗、数据处理
2.3 特征抽取
2.3.1 特征提取
1. 将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注: 特征值化是为了计算机更好的去理解数据
字典特征提取(特征离散化) 文本特征提取 图像特征提取(深度学习将介绍)
2. 特征提取API
sklearn.feature_extraction
2.3.2 字典特征提取 - 类别 -> one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
vector 数学:向量 物理:矢量 矩阵 matrix 二维数组 向量 vector 一维数组
父类:转换器类 transfer 返回sparse矩阵
示例
字典特征抽取
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
def dict_extract():
"""字典特征抽取"""
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
transfer = DictVectorizer()
data_new = transfer.fit_transform(data)
print("data_mew:", data_new)
结果: sparse=True时(默认),返回的是个稀疏矩阵
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
def dict_extract():
"""字典特征抽取"""
data = [{'city': '北京', 'temperature': 100},
{'city': '上海', 'temperature': 60}, {'city': '深圳', 'temperature': 30}]
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
print("data_mew:", data_new)
print("特征名字:", transfer.get_feature_names())
sparse=False时,返回的是个one-hot编码的二维数组
sparse稀疏 将非零值按位置表示出来 节省内存 - 提高加载效率
字典特征抽取的应用场景:
- 1)pclass, sex 数据集当中类别特征比较多
- 将数据集的特征-》字典类型
- DictVectorizer转换
- 2)本身拿到的数据就是字典类型
2.3.3 文本特征提取
单词 作为 特征 句子、短语、单词、字母 特征:特征词
方法1:CountVectorizer
统计每个样本特征词出现的个数
示例
文本特征提取,统计每个样本特征词出现的个数
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
def text_extract():
"""文本特征抽取"""
data = ["life is short,i like like python", "life is too long,i dislike python"]
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print("data_new:", data_new.toarray(), type(data_new))
print("特征名字:", transfer.get_feature_names())
结果: 注意: CountVectorizer是没有sparse参数的,不过这个’scipy.sparse.csr.csr_matrix’类里有toarray()方法,可以直接调用 同样的,DictVectorizer也有toarray()方法
sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) stop_words停用的词表(以列表的形式传入) 停用词表
示例
中文文本特征提取
def text_extract_chinese():
"""中文文本特征抽取"""
data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
transfer = CountVectorizer()
data_new = transfer.fit_transform(data)
print("data_new:", data_new.toarray(), type(data_new))
print("特征名字:", transfer.get_feature_names())
结果: 注意: 中文如果直接使用CountVectorizer是得不出正确结果的。英文默认是以空格分开的,其实就达到了一个分词的效果,所以我们要对中文进行分词处理。
示例
中文文本特征抽取,使用jieba库完成自动分词
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def text_extract_chinese_auto():
"""中文文本特征抽取,自动分词"""
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent_text in data:
data_new.append(cut_words(sent_text))
transfer = CountVectorizer()
data_result = transfer.fit_transform(data_new)
print("data_new:", data_result.toarray())
print("特征名字:", transfer.get_feature_names())
结果: 关键词:在某一个类别的文章中,出现的次数很多,但是在其他类别的文章当中出现很少
方法2:TfidfVectorizer
TF-IDF - 用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
主要思想是:某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- TF - 词频(term frequency,tf):某一个给定的词语在该文件中出现的频率
- IDF - 逆向文档频率:是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
t
f
i
d
f
i
,
j
=
t
f
i
,
j
×
i
d
f
i
,
j
tfidf_{i,j} = tf_{i,j}×idf_{i,j}
tfidfi,j?=tfi,j?×idfi,j?
两个词 “经济”,“非常” 1000篇文章-语料库 100篇文章 - “非常” 10篇文章 - “经济”
两篇文章 文章A(100词) : 10次“经济” TF-IDF:0.2 tf:10/100 = 0.1 idf:lg 1000/10 = 2 文章B(100词) : 10次“非常” TF-IDF:0.1 tf:10/100 = 0.1 idf: log 10 1000/100 = 1
示例
使用TF-IDF进行中文文本特征抽取
def tfidf_text_extract_chinese_auto():
"""tfidf中文文本特征抽取,自动分词"""
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
data_new = []
for sent_text in data:
data_new.append(cut_words(sent_text))
transfer = TfidfVectorizer()
data_result = transfer.fit_transform(data_new)
print("data_new:", data_result.toarray())
print("特征名字:", transfer.get_feature_names())
结果: 返回的是带权重的矩阵
2.4 特征预处理
2.4.1 什么是特征预处理
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
为什么我们要进行归一化/标准化? 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
- 需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格
2.4.2 归一化
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
缺点:鲁棒性较差 归一化异常值为最大值、最小值的时候,归一化结果描述数据不够准确。
应用场景:只适合传统精确小数据场景。
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… ) MinMaxScalar.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array
示例
数据归一化处理
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler
import jieba
import pandas as pd
def normalization():
"""归一化"""
data = pd.read_csv("dating.txt")
data = data.iloc[:, :3]
print("data:\n", data)
transfer = MinMaxScaler()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
结果: 注意: 导入文件的时候需要使用pandas库
2.4.3 标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内 (x - mean) / std 标准差:集中程度
应用场景: 在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
sklearn.preprocessing.StandardScaler( ) 处理之后每列来说所有数据都聚集在均值0附近标准差差为1 StandardScaler.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array
示例
数据标准化处理
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
import jieba
import pandas as pd
def normalization():
"""归一化"""
data = pd.read_csv("../usingFiles/dating.txt")
data = data.iloc[:, :3]
print("data:\n", data)
transfer = MinMaxScaler()
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
结果:
2.5特征降维
2.5.0 降维概念
ndarray 维数:嵌套的层数 0维 标量 1维 向量 2维 矩阵 3维 n维
此处降维针对二维数组而言 此处的降维:降低特征的个数 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程。
效果:特征与特征之间不相关
降维的两种方式:
2.5 降维
2.5.1 特征选择
定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
Filter过滤式
- 方差选择法:低方差特征过滤
特征方差小:某个特征大多样本的值比较相近 特征方差大:某个特征很多样本的值都有差别 sklearn.feature_selection.VarianceThreshold(threshold = 0.0) 删除所有低方差特征 Variance.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features] 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
- 相关系数 - 特征与特征之间的相关程度
取值范围:–1≤ r ≤+1 皮尔逊相关系数 0.9942
特征与特征之间相关性很高: 1)选取其中一个 2)加权求和 3)主成分分析
示例
过滤低方差特征,查看特征之间的相关性
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.feature_selection import VarianceThreshold
from scipy.stats import pearsonr
import jieba
import pandas as pd
def variance_election():
"""过滤低方差特征"""
data = pd.read_csv("../usingFiles/factor_returns.csv")
data = data.iloc[:, 1:-2]
print("data:\n", data)
transfer = VarianceThreshold(threshold=5)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, data_new.shape)
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print("pe_ratio与pb_ratio相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense相关系数:\n", r2)
结果:
Embeded嵌入式
决策树 第二天 正则化 第三天 深度学习 第五天 主成分分析
2.6.1 主成分分析(PCA)
sklearn.decomposition.PCA(n_components=None) n_components 小数 表示保留百分之多少的信息 整数 减少到多少特征
示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
from scipy.stats import pearsonr
import jieba
import pandas as pd
def pca():
"""PCA降维"""
data = [[2, 8, 4, 5],
[6, 3, 0, 8],
[5, 4, 9, 1]]
transfer = PCA(n_components=2)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
结果:
2.6.2 案例:探究用户对物品类别的喜好细分
用户 物品类别 user_id aisle 1)需要将user_id和aisle放在同一个表中 - 合并 2)找到user_id和aisle - 交叉表和透视表 3)特征冗余过多 -> PCA降维
示例
探究用户对物品类别的喜好细分降维
def homework():
"""探究用户对物品类别的喜好细分降维"""
products = pd.read_csv("../usingFiles/instacart/products.csv")
order_products = pd.read_csv("../usingFiles/instacart/order_products__prior.csv")
orders = pd.read_csv("../usingFiles/instacart/orders.csv")
aisles = pd.read_csv("../usingFiles/instacart/aisles.csv")
tab1 = pd.merge(orders, order_products, on=["order_id", "order_id"])
tab2 = pd.merge(tab1, products, on=["product_id", "product_id"])
tab3 = pd.merge(tab2, aisles, on=["aisle_id", "aisle_id"])
table = pd.crosstab(tab3["user_id"], tab3["aisle"])
print("table.shape", table.shape)
transfer = PCA(n_components=0.95)
data = transfer.fit_transform(table)
print("data.shape:", data.shape)
结果: 特征减少了90个
总结
|