机器学习入门1
文章目录
一、 机器学习概述
1.1 人工智能概述
- 机器学习、人工智能、深度学习三者之间的关系
- 机器学习是人工智能的一个实现途径
- 深度学习是机器学习的一个方法发展而来
- 1956达特茅斯会议——人工智能的起点
- 用机器来模仿人类学习以及其他方面的智能
- 1956年人工智能元年
- 人工智能应用场景:传统预测、图像识别、自然语言处理
1.2 机器学习
机器学习是从数据中自动分析获得模型,并利用模型对未知数据进行预测
- 数据集构成:特征值+目标值
- 每一条数据我们称之为样本
- 有些数据集可以没有目标值
1.3 机器学习算法分类
- 分类问题:目标值为类别
- 回归问题:目标值为连续性数据
- 无监督学习:无目标值
- 监督学习supervised learning(预测):
- 定义:输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称为分类)
- 分类k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归
- 回归:线性回归、岭回归
- 无监督学习unsupervised learning:
- 定义:输入数据是由输入特征值所组成
- 聚类k-means
1.4 机器学习开发流程
- 获取数据
- 数据处理
- 特征工程
- 机器学习算法训练 - 模型
- 模型评估
- 应用
1.5 学习框架
算法是核心,数据与计算是基础
学会分析问题,使用机器学习算法的目的,想要算法完成何种任务
- 入门
- 实战类书籍
- 提升内功
二、 特征工程
2.1 数据集
-
部分可用数据集
- sklearn数据集:
- 特点:数据量较小;方便学习
- http://scikit-learn.org/stable/datasets/index.html#datasets
- kaggle数据集:
- 特点:大数据竞赛平台;80万科学家;真实数据;数据量巨大
- https://www.kaggle.com/datasets
- UCI数据集:
- 特点:收录了360个数据集;覆盖科学、生活、经济等领域;数据量几十万
- http://archive.ics.uci.edu/ml/
- sklearn数据集:
-
scikit-learn工具介绍:
- python语言的机器学习工具;scikit-learn包括许多知名的机器学习算法的实现;scikit-learn文档完善,容易上手,丰富的API
- 安装
- 包含内容:
- 分类、聚类、回归
- 特征工程
- 模型选择、调优
-
sklearn数据集:
-
scikit-learn数据集API介绍:
- sklearn.datasats
- 加载获取流行数据集
- datasats.load_*():获取小规模数据集,数据包含在datasets里
- datasets.fetch_*(data_home=None):获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是~/scikit_learn_data/
- sklearn.datasats
-
sklearn小数据集:
-
sklearn.datasets.load_iris():加载返回鸢尾花数据集
名称 数量 类别 3 特征 4 样本数量 150 每个类别数量 50 -
sklearn.datasets.load_boston():加载并返回波士顿房价数据集
名称 数量 目标类别 5-50 特征 13 样本数量 506
-
-
sklearn大数据集:
- sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’):
- subset:‘train’或者’test’或者’all’,可选,选择要加载的数据集
- 训练集的“训练”,测试集的“测试”,两者的“全部”
- sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’):
-
sklearn数据集的使用(以鸢尾花数据集为例):
-
load和fetch返回的数据类型是字典格式:
- data:特征数据数组,是[n_samples*n_features]的二维numpy.ndarray数组
- target:标签数组,是n_samples的一维numpy.ndarray数组
- DESCR:数据描述
- feature_names:特征名,新闻数据,手写数字、回归数据集没有
- target_names:标签名
-
获取数据集示例:
from sklearn.datasets import load_iris def datasets_demo(): """ sklearn数据集使用 :return: """ # 获取数据集 iris = load_iris() print("鸢尾花数据:\n", iris) print("查看数据集描述:\n", iris["DESCR"]) print("查看特征值的名字:\n", iris.feature_names) print("查看特征值:\n", iris.data, iris.data.shape) return None if __name__ == "__main__": datasets_demo()
-
-
-
数据集的划分:
-
机器学习一般的数据集会划分为两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
-
划分比例:
训练集 测试集 70% 30% 80% 20% 75% 30% -
数据划分api:sklearn.model_selection.train_test_split(arrays, *options)
-
x:数据集的特征值
-
y:数据集的标签值
-
teat_size:测试集的大小,一般为float
-
random_state:随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同
-
return:训练集特征值,测试集特征值,训练集目标值,测试集目标值
-
示例:
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split def datasets_demo(): """ sklearn数据集使用 :return: """ # 获取数据集 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) return None if __name__ == "__main__": datasets_demo()
-
-
2.2 特征工程介绍
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程
特征工程包含内容:特征抽取/提取、特征预处理、特征降维
2.3 特征抽取/提取
-
将任意数据(如文本或者图像)转换为可用于机器学习的数字特征(为了计算机更好的去理解数据):
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习)
-
特征提取API:sklearn.feature_extraction
-
字典特征提取:对字典数据进行特征值化
-
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X):X:字典或者包含字典的迭代器;返回值:返回sparse矩阵(稀疏矩阵,将非零值按位置表示出来)
- DictVectorizer.inverse_transform(X):X:array数组或者sparse矩阵;返回值:转换之前数据格式
- DictVectorizer.get_feature_names():返回类别名称
-
示例:
def dict_demo(): """ 字典特征提取 :return: """ 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(data_new) return None
-
对于特征当中存在类别信息的我们都会做one-hot编码处理
-
应用场景:数据集中特征比较多;本身拿到的数据就是字典类型
-
-
文本特征提取:对文本数据进行特征值化
-
方法:
- sklearn.feature_extraction.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
-
示例:
def count_demo(): """ 文本特征提取 :return: """ data = [ "life is short, i like python", "life is too long, i dislike python" ] # 1. 实例化一个转换器类 transfer = CountVectorizer() # 2. 调用fit_transform() data_new = transfer.fit_transform(data) print(transfer.get_feature_names_out()) print(data_new.toarray()) return None
-
统计每个样本特征词出现的个数
-
中文文本特征提取:需要对中文进行分词处理
-
示例:
def cut_word(text): """ 进行中文分词 :param text:将被分词的中文 :return: """ return " ".join(list(jieba.cut(text))) def count2_demo(): """ 中文文本特征提取 :return: """ data = [ "一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年前发出的,这样当我们看到宇宙时,我们是在看它的过去", "如果只用一种方式了解某样事物,你就不会真正了解他。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。" ] # 1. 将中文文本分词 data_new = [] for sent in data: data_new.append(cut_word(sent)) # 2. 实例化一个转换器类 transfer = CountVectorizer() # 3. 调用fit_transform() data_new = transfer.fit_transform(data) print(transfer.get_feature_names_out()) print(data_new.toarray()) return None
-
-
Tf-idf文本特征提取
-
主要思想:如果某个词或者短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类
-
TF-IDF作用:用以评估一字词对于一个文件集或者一个语料库中的其中一份文件的重要程度
-
公式:
-
API:
-
sklearn.feature_extraction.text.TfidfVectorize(stop_words=[],…)
-
返回词的权重矩阵:
API X 返回值 TfidfVectorize.fit_transform(X) 文本或者包含文本字符串的可迭代对象 返回sparse矩阵 TfidfVectorize.inverse_transform(X) array数组或者sparse矩阵 转换之前数据格式 TfidfVectorize.get_feature_names() 单词列表
-
-
示例:
def tfidf_demo(): """ 用Tf-idf的方法进行文本特征提取 :return: """ data = [ "一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。", "我们看到的从很远星系来的光是在几百万年前发出的,这样当我们看到宇宙时,我们是在看它的过去", "如果只用一种方式了解某样事物,你就不会真正了解他。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。" ] # 1. 将中文文本分词 data_new = [] for sent in data: data_new.append(cut_word(sent)) # 2. 实例化一个转换器类 transfer = TfidfVectorizer() # 3. 调用fit_transform() data_new = transfer.fit_transform(data) print(transfer.get_feature_names_out()) print(data_new.toarray()) return None
-
-
2.4 特征预处理
特征预处理(sklearn.preprocessing):通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程,包含:归一化、标准化
特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其他的特征,因此要进行数据预处理(归一化/标准化)
2.4.1 归一化
-
定义:通过对原始数据进行变换把数据映射到【0, 1】(默认)之间
-
公式:
-
API
- sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples, n_features]
- 返回值:转换后的形状相同的array
-
示例:
def minmax_demo(): """ 归一化 :return: """ # 1、获取数据 data = pd.read_csv("dating.txt") data = data.iloc[:, :3] print("data:\n", data) # 2、实例化一个转换器类 transfer = MinMaxScaler(feature_range=[2, 3]) # 3、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None
-
缺点:最大值最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景
2.4.2 标准化
-
定义:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
-
公式:
-
与归一化对比:
- 对于归一化来说,如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说,如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差影响较小
-
API
- sklearn.preprocessing.StandardScaler()
- 处理之后,对每列来说,所有数据都聚集在均值为0附近,标准差为1
- StandardScaler.fit_transform(X):
- X:numpy array格式的数据[n_samples, n_features]
- 返回值:转换后的形状相同的array
- sklearn.preprocessing.StandardScaler()
-
示例:
def stand_demo(): """ 标准化 :return: """ # 1、获取数据 data = pd.read_csv("dating.txt") data = data.iloc[:, :3] print("data:\n", data) # 2、实例化一个转换器类 transfer = StandardScaler() # 3、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None
-
应用场景:在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景
2.5 特征降维
降维,是指在某些限定条件下,降低随机变量/特征个数,得到一组“不相关”主变量的过程(降低随机变量的个数)
有两种方式:特征选择、主成分分析(可以理解为一种特征提取的方式)
特征选择:
-
定义:数据中包含冗余或相关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征
-
方法:
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
- 方差选择法:低方差特征过滤
- 相关系数
- Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)
- 决策树:信息熵、信息增益
- 正则化:L1,L2
- 深度学习:卷积等
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
-
模块:sklearn.feature_selextion
-
过滤式:
-
低方差特征过滤:删除低方差的一些特征(特征方差小,某个特征大多样本的值比较接近;特征方差大,某个特征很多样本的值都有差别)
-
API:
-
sklearn.feature_selextion.VarianceThreshold(threshold=0.0) 删除所有低方差特征
-
Variance.fit_transform(X)
参数 描述 X numpy array格式的数据[n_samples, n_features] 返回值 训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征
-
-
示例:
def variance_demo(): """ 过滤低方差特征 :return: """ # 1、获取数据 data = pd.read_csv("factor_returns.csv") data = data.iloc[:, 1:-2] print("data:\n", data) # 2、实例化一个转换器类 transfer = VarianceThreshold(threshold=10) # 3、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new, data_new.shape) # 计算某两个变量之间的相关系数 r1 = pearsonr(data["pe_ratio"], data["pb_ratio"]) print("相关系数:\n", r1) r2 = pearsonr(data['revenue'], data['total_expense']) print("revenue与total_expense之间的相关性:\n", r2) return None
-
-
相关系数:反应变量之间相关关系密切程度的统计指标
- 相关系数的值介于-1与+1之间,其性质如下:
- API:from scipy.stats import pearsonr
- 示例:见上案例最后
-
2.6 主成分分析
-
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
-
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息
-
应用:回归分析或者聚类分析当中
-
API:
- sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间
- n_components:小数表示保留百分之多少的信息;整数表示减少到多少特征
- PCA.fit_transform(X):numpy array格式的数据[n_samples, n_features]
- 返回值:转换后指定维度的array
- sklearn.decomposition.PCA(n_components=None)
-
示例:
def pca_demo(): """ PCA降维 :return: """ data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]] # 1、实例化一个转换器类 transfer = PCA(n_components=0.95) # 2、调用fit_transform data_new = transfer.fit_transform(data) print("data_new:\n", data_new) return None