AI | 第1章 机器学习 Sklearn 入门笔记
前言
仅供参考
1. 机器学习概述
1.1 人工智能、机器学习、深度学习的联系
- 人工智能的起点:达特茅斯会议(1956年8月,美国汉诺斯小镇,达特茅斯学院);
- 1956年为人工智能元年;
- 人工智能两大流派:
- 联结主义:仿生人的神经网络,其认为人工智能源于仿生学,特别是人脑模型的研究;
- 符号主义:人的思考有一定逻辑所在,其致力于用某种符号来描述人类的认知过程,并把这种符号输入到能处理符号的计算机中,从而模拟人类的认知过程。(艾伦·纽厄尔、赫伯特·西蒙);
- 机器学习:利用统计的方法实现人工智能;
- 深度学习:人工神经网络是机器学习的一种方法,人工神经网络经过发展形成深度神经网络,深度神经网络经过各行业发展总结成深度学习;
- 机器学习算法是核心,数据和计算是基础;
- 分工合作:
- 顶级算法工程师:负责大部分复杂模型的算法设计;
- 算法+后台:分析处理数据、分析业务、应用常见算法、特征工程。调参数、优化;
- 深入学习:大学数学基础 -> 统计学习方法 -> 机器学习库与框架 -> 应用;(周期长但稳)
- 速成学习:入门、了解原理 -> 实战应用 -> 深入数学、算法、统计学习;
1.2 机器学习、数据集值概述
- 定义:机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测;
- 数据集:特征值+目标值;
- 每一行数据可以称之为样本;
- 有些数据集可以没有目标值;
1.3 机器学习算法分类
- 利用目标值分类:
- 分类问题:目标值有类别(离散型);
- 回归问题:目标值是数据(连续型);
- 无监督学习:无目标值;
- 总结:
-
监督学习:输入数据有特征有标签,即有标准答案;(分类、回归)
- 定义:输入数据是由输入特征值和目标值所组成。函数的输出可以是有限个离散值(分类),或是输出是一个连续的值(回归);
- 分类:k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归与二分类、神经网络;
- 回归:线性回归、岭回归;
-
无监督学习:输入数据有特征无标签,即无标准答案;(聚类)
- 定义:输入数据是由输入特征值所组成;
- 聚类:k-means;
-
1.4 机器学习开发流程
- 获取数据(数据集);
- 数据处理;
- 特征工程;
- 机器学习算法训练,得到模型;
- 模型评估;(模型好则应用,不好则 2.数据处理 循环)
- 应用;
1.5 机器学习库与框架
- 机器学习:scikit-learn;
- 深度学习:TensorFlow、Pytorch、Caffe2、Theamo、Chainer;
2. 数据集
2.1 可用的数据集
- 实际:公司内部、用户历史数据、共享数据接口;
- 学习阶段:sklearn(数据量少、方便学习)、Kaggle(大数据竞赛平台、真实数据、数据量大)、UCI(360个数据集、覆盖科学生活经济等、数据量几十万);
2.2 Scikit-learn 简介、安装及使用
- 简介:
- Python 语言的机器学习工具;
- Scikit-learn 包括许多知名的机器学习算法的实现;
- Scikit-learn 文档完善,容易上手,丰富的 API;
- 安装:
pip3 install Scikit-learn
; - API介绍:
sklearn.datasets
:加载获取流行数据集;datasets.load_*()
:获取小规模数据集,数据包含在 datasets 里;datasets.fetch_*(data_home=None)
:获取大规模数据集,需要从网络上下载,函数的第一个参数是 data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/;
2.3 举例 Scikit-learn 部分数据集介绍
- 获取小数据集:
sklearn.datasets.load_iris()
:加载并返回鸢尾花数据集;sklearn.datasets.load_boston()
:加载并返回波士顿房价数据集;
- 获取大数据集:
- API:
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
- subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集;
- 训练集的“训练”,测试集的“测试”,两者的“全部”;
- API:
2.4 Scikit-learn 数据集返回值介绍
load_*
和fetch_*
返回的数据类型是datasets.base.Bunch
(继承自字典格式),key 如下:- data:特征数据数组。是 [n_samples * n_features] 的二维 numpy.ndarray 数组;
- target:标签数组。是 n_samples 的一维 numpy.ndarray 数组;
- DESCR:数据描述;
- feature_names:特征名。新闻数据,手写数字、回归数据集没有;
- target_names:标签名;
- 获取数据值 value 的方法:
dict["key"] = values
bunch.key = values
2.5 数据集的划分
- 分类:
- 训练数据:用于训练,构建模型;
- 测试数据:在模型检验时使用,用于评估模型是否有效;
- 划分比例:
- 训练集:70% 80% 75%
- 测试集:30% 20% 30%
- sklearn 数据集划分 API:
sklearn.model_selection.train_test_split(arrays, *options)
- x 数据集的特征值;
- y 数据集的标签值;
- test_size 测试集的大小,一般为 float;
- random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相
同; - return 训练集特征值,测试集特征值,训练集目标值,测试集目标值;
*Code1 数据集代码示例
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def datasets_demo():
# 2.3 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris)
# 2.4 返回值是一个继承自字典的Bench
# print("鸢尾花的特征值:\n", iris["data"])
# print("鸢尾花的目标值:\n", iris.target)
# print("鸢尾花特征的名字:\n", iris.feature_names)
# print("鸢尾花目标值的名字:\n", iris.target_names)
# print("鸢尾花的描述:\n", iris.DESCR)
# 2.5 数据集划分
# test_size: 测试集范围
# random_state:随机数种子
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target,test_size=0.25,random_state=22)
print("训练集的特征值:\n", x_train, x_train.shape)
return None
# 表示作为脚本直接执行,import 到其他的 python 脚本中不会执行
if __name__ == "__main__":
# 代码1:sklearn 数据集的使用
datasets_demo()
3. 特征工程
吴恩达:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已;
3.1 概述
- 定义:使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程;
3.2 特征抽取 feature_extraction
- 定义:将任意数据(如文本或图像)转换为可用于机器学习的数字特征;(特征值化)
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习)
- 提取 API:
sklearn.feature_extraction
;
3.2.1 字典特征提取 DictVectorizer
- 作用:对字典数据进行特征值化;
- 对于特征当中存在的类别信息会做 one-hot 编码处理;
- 类:
sklearn.feature_extraction.DictVectorizer(sparse=True,...)
sparse 表示稀疏矩阵;DictVectorizer.fit_transform(X)
:X 是字典或者包含字典的迭代器返回值。返回 sparse 矩阵;DictVectorizer.inverse_transform(X)
:X 是 array 数组或者 sparse 矩阵。返回转换之前数据格式;DictVectorizer.get_feature_names_out()
:返回类别名称;
- 流程步骤:
- 实例化类
DictVectorizer
; - 调用
fit_transform
方法输入数据并转换(注意返回格式);
- 实例化类
- 应用场景:
- 数据集中类别特征比较多(先将数据集的特征转成字典类型,再使用 DictVectorizer 转换);
- 本身拿到的数据就是字典类型;
*Code2 字典特征提取代码示例
def dict_demo():
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
# 1.实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2.调用fit_transform
data_new = transfer.fit_transform(data)
print("返回的结果:\n", data_new)
# 打印特征名字
print("特征名字:\n", transfer.get_feature_names_out())
return None
3.2.2 文本特征提取
有两种方法,一种统计词频率,另一种统计关键词;
- 作用:对文本数据进行特征值化;
1. 词频提取 CountVectorizer
- 类:
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_out()
:返回单词列表(特征)- 流程步骤:
- 中文需要先用 jieba 分词库进行分词处理
" ".join(list(jieba.cut(text)))
; - 实例化类
CountVectorizer
; - 调用
fit_transform
方法输入数据并转换 (注意返回格式,利用toarray()
进行 sparse 矩阵转换 array 数组)
- 中文需要先用 jieba 分词库进行分词处理
*Code3 英文词频提取代码示例
def en_count_demo():
data = ["life is short,i like python","life is too too long,i dislike python"]
# 1.实例化一个转换器类
transfer = CountVectorizer()
# transfer = CountVectorizer(stop_words=["is","too"]) #带停用词形式
# 2.调用 fit_transform
data_new = transfer.fit_transform(data)
print("data_new 的类型:" , type(data_new))
print("文本特征抽取的结果:\n", data_new.toarray())
print("返回特征名字:\n", transfer.get_feature_names_out())
return None
*Code4 中文词频提取代码示例
def cut_word(text):
return " ".join(list(jieba.cut(text)))
def ch_count_demo():
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 1.将中文文本进行分词
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# 2.实例化一个转换器类
transfer = CountVectorizer()
# 3.调用 fit_transform
data_final = transfer.fit_transform(data_new)
print("data_final 的类型:" , type(data_final))
print("文本特征抽取的结果:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None
2. 关键词提取 TF-IDF
- TF-IDF 的主要思想:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类;
- TF-IDF 作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度;
- 公式:
- 词频(term frequency,tf) 指的是某一个给定的词语在该文件中出现的频率;
- 逆向文档频率(inverse document frequency,idf) 是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到最终得出结果可以理解为重要程度;
- 公式:
T F − I D F = i f ∗ i d f TF-IDF = if * idf TF−IDF=if∗idf
- 类:
sklearn.feature_extraction.text.TfidfVectorizer(stop_words=[])
;
*Code5 TF-IDF 提取代码示例
def cut_word(text):
return " ".join(list(jieba.cut(text)))
def tfidf_demo():
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 1.将中文文本进行分词
data_new = []
for sent in data:
data_new.append(cut_word(sent))
# 2.实例化一个转换器类
transfer = TfidfVectorizer()
# 3.调用 fit_transform
data_final = transfer.fit_transform(data_new)
print("data_final 的类型:", type(data_final))
print("文本特征抽取的结果:\n", data_final.toarray())
print("特征名字:\n", transfer.get_feature_names_out())
return None
3.3 特征预处理
- 定义:通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程;
- 包含内容:数值型数据的无量纲化(归一化、标准化),即使不同规格的数据转换到同一规格;
3.3.1 归一化 MinMaxScaler
- 定义:通过对原始数据进行变换把数据映射到(默认为 [0,1]) 之间;(mx 默认为1,mi 默认为0)
- 缺点:鲁棒性较差,容易受极端数据影响。只适合传统精确小数据场景;
- 公式:
X
‘
=
x
−
m
i
n
m
a
x
−
m
i
n
X^` =\frac{x-min}{max-min}
X‘=max−minx−min
X
‘
‘
=
X
‘
∗
(
m
x
−
m
i
)
+
m
i
X^{``}=X^`*(mx-mi)+mi
X‘‘=X‘∗(mx−mi)+mi
- 类:
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)... )
- API:
MinMaxScalar.fit_transform(X)
- X 为 numpy array 格式的数据 [n_samples,n_features];
- 返回转换后的形状相同的 array;
- API:
*Code6 归一化代码示例
def minmax_demo():
# 1.获取数据
data = pd.read_csv("../resources/data/dating.txt", sep='\t')
data = data.iloc[:,:3]
print("data:\n", data)
# 2.实例化一个转化器类
transfer = MinMaxScaler()
# transfer = MinMaxScaler(feature_range=[2, 3]) #带范围
# 3.调用 fit_transform
data_new = transfer.fit_transform(data)
print("最小值最大值归一化处理的结果:\n", data_new)
return None
3.3.2 标准化 StandardScaler
- 定义:通过对原始数据进行变换把数据变换到均值为 0,标准差为 1 范围内;
- 公式:作用于每一列,mean为平均值,σ为标准差;
X ‘ = x − m e a n σ X^`=\frac{x-mean}{\sigma} X‘=σx−mean
- 类:
sklearn.preprocessing.StandardScaler( )
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
- API:
StandardScaler.fit_transform(X)
- X 为 numpy array 格式的数据 [n_samples,n_features];
- 返回转换后的形状相同的 array;
*Code7 标准化代码示例
def stand_demo():
# 1.获取数据
data = pd.read_csv("../resources/data/dating.txt", sep='\t')
data = data.iloc[:,:3]
print("data:\n", data)
# 2.实例化一个转化器类
transfer = StandardScaler()
# 3.调用 fit_transform
data_new = transfer.fit_transform(data)
print("标准化处理的结果:\n", data_new)
return None
3.4 特征降维
3.4.1 概述
- 定义:降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程;
- 特征降维的两种方式:
- 特征选择;
- 主成分分析(特征提取);
3.4.2 特征降维方法(特征选择)
- 定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征;
- 方法:
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联;
- 方差选择法:低方差特征过滤;
- 相关系数法:特征与特征之间的相关程度;
- Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联);
- 决策树:信息熵、信息增益;
- 正则化:L1、L2;
- 深度学习:卷积等;
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联;
1. 方差选择法 VarianceThreshold
- 类:
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
;- API:
VarianceThreshold.fit_transform(X)
;- X 为 numpy array 格式的数据 [n_samples,n_features];
- 返回值:训练集差异低于 threshold 的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征;
- API:
*Code8 方差选择法代码示例
def variance_demo():
data = pd.read_csv("../resources/p01_machine_learning_sklearn/factor_returns.csv")
print(data)
# 1、实例化一个转换器类
transfer = VarianceThreshold()
# transfer = VarianceThreshold(threshold=5) #设置方差阈值
# 2、调用fit_transform
data_new = transfer.fit_transform(data.iloc[:, 1:-2])
print("删除低方差特征的结果:\n", data_new)
print("形状:\n", data_new.shape)
return None
2. 相关系数法 pearsonr
- 皮尔逊相关系数(Pearson Correlation Coefficient):反映变量之间相关关系密切程度的统计指标;
- 公式:
r = n ∑ x y − ∑ x ∑ y n ∑ x 2 − ( ∑ x ) 2 n ∑ y 2 − ( ∑ y ) 2 r=\frac{n\sum_{}xy-\sum_{}x\sum_{}y}{\sqrt{n\sum_{}x^2-(\sum_{}x)^2} \sqrt{n\sum_{}y^2-(\sum_{}y)^2}} r=n∑x2−(∑x)2n∑y2−(∑y)2n∑xy−∑x∑y
-
相关系数的特点:
- 相关系数的值介于 –1 与 +1 之间,即 –1≤ r ≤+1;
- 当 r> 0时,表示两变量正相关,r<0 时,两变量为负相关;
- 当 0<|r|<1 时,表示两变量存在一定程度的相关。且 |r| 越接近 1,两变量间线性关系越密切;|r| 越接近于 0,表示两变量的线性相关越弱;
- 一般可按三级划分:|r|<0.4 为低度相关;0.4≤|r|<0.7 为显著性相关;0.7≤|r|<1 为高度线性相关;
-
特征降维策略:
- 选取其中一个;
- 加权求和;
- 主成分分析;
-
库:
from scipy.stats import pearsonr
- API:
pearsonr(X,Y)
:- x : (N,) array_like
- y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
- API:
*Code9 相关系数法代码示例
from scipy.stats import pearsonr
import matplotlib.pyplot as plt
def pearsonr_demo():
data = pd.read_csv("../resources/p01_machine_learning_sklearn/factor_returns.csv")
# 1.计算皮尔逊相关系数
r = pearsonr(data["revenue"], data["total_expense"])
print("皮尔逊相关系数:", r)
# 2.绘图
plt.figure(figsize=(20, 8), dpi=100)
plt.scatter(data["revenue"], data["total_expense"])
plt.show()
return None
3.4.3 主成分分析 PCA
-
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量;
-
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息;
-
应用:回归分析或者聚类分析当中;
-
例子:二维降成一维可以理解成:找到一条合适的直线,使二维信息尽可能完整。即通过矩阵运算得出主成分分析的结果;
-
类:
sklearn.decomposition.PCA(n_components=None)
- n_components:
- 小数:表示保留百分之多少的信息;
- 整数:减少到多少特征;
- API:
PCA.fit_transform(X)
- X 为 numpy array 格式的数据 [n_samples,n_features];
- 返回值:转换后指定维度的 array;
- n_components:
*Code10 主成分分析代码示例
def pca_demo():
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 1、实例化PCA, 小数——保留多少信息
transfer = PCA(n_components=0.9)
# 2、调用fit_transform
data1 = transfer.fit_transform(data)
print("保留90%的信息,降维结果为:\n", data1)
# 1、实例化PCA, 整数——指定降维到的维数
transfer2 = PCA(n_components=3)
# 2、调用fit_transform
data2 = transfer2.fit_transform(data)
print("降维到3维的结果:\n", data2)
return None