文章目录
教程
环境配置
Anaconda和Jupyter
更换pip源
更换清华pip源
参考链接:
机器学习概述
1.1 人工智能概述
- 达特茅斯会议-人工智能的起点
- 机器学习是人工智能的一个实现途径
- 深度学习是机器学习的一个方法发展而来
1.1.2 机器学习、深度学习能做些什么
- 传统预测
- 图像识别
- 自然语言处理
1.2 什么是机器学习
- 数据
- 模型
- 预测
从历史数据当中获得规律?这些历史数据是怎么的格式?
1.2.3 数据集构成
- 特征值 + 目标值
有的时候可能是没有目标值的:目标特征分类
1.3 机器学习算法分类
监督学习
定义︰输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值(称为回归),或是输出是有限个离散值(称作分类)
-
目标值:类别 - 分类问题
k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归 -
目标值:连续型的数据 - 回归问题
线性回归、岭回归
无监督学习
定义∶输入数据是由输入特征值所组成。
- 目标值:无 - 无监督学习
聚类 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
安装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
API
sklearn.datasets
加载获取流行数据集
- datasets.load_*()
获取小规模数据集,数据包含在datasets里 - datasets.fetch_*(data_home=None)
获取大规模数据集,需要从网络上下载。- data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
- subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集。
训练集的“训练”,测试集的“测试”,两者的“全部”
sklearn数据集返回值:
load和fetch返回的数据类型datasets.base.Bunch(字典格式)
- data:特征数据数组,是 [n_samples * n_features] 的二维 numpy.ndarray 数组
- target:标签数组,是 n_samples 的一维 numpy.ndarray 数组
- DESCR:数据描述
- feature_names:特征名,新闻数据,手写数字、回归数据集没有
- target_names:标签名
示例
- sklearn.datasets.load_iris()
加载并返回鸢尾花数据集 - sklearn.datasets.load_boston()
加载并返回波士顿房价数据集 - sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
加载20类新闻数据集
2.1.3 数据集的划分
训练数据:用于训练,构建模型
测试数据:在模型检验时使用,用于评估模型是否有效
训练集:70% 80% 75%
测试集:30% 20% 30%
API
sklearn.model_selection.train_test_split(arrays, *options)
- x 数据集的特征值
- y 数据集的标签值
- test_size 测试集的大小,一般为float
- random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
- return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)
- 训练集特征值,测试集特征值,训练集目标值,测试集目标值
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)
# sepal:花萼 petal:花瓣
# print("查看数据集描述:\n", iris["DESCR"])
print("查看数据集描述:\n", iris.DESCR)
print("查看特征值名字:\n", iris.feature_names)
print("查看特征值:\n", iris.data, iris.data.shape)
# 数据集划分,参数分别为:特征值,目标值,测试集比例(默认0.25),随机数种子
# x_train = 训练集特征值, x_test = 测试集特征值, y_train = 训练集目标值, y_test = 测试集目标值
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)
结果:
查看特征值名字:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
查看特征值:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
[5. 3.6 1.4 0.2]
...(太长了,删掉了部分数据)
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]] (150, 4)
查看训练集特征值:
[[4.8 3.1 1.6 0.2]
[5.4 3.4 1.5 0.4]
[5.5 2.5 4. 1.3]
[5.5 2.6 4.4 1.2]
...(太长了,删掉了部分数据)
[6.3 3.3 6. 2.5]
[5.1 3.8 1.9 0.4]
[6.4 2.8 5.6 2.2]
[7.7 3.8 6.7 2.2]] (120, 4)
2.2 特征工程介绍
算法 特征工程
2.2.1 为什么需要特征工程(Feature Engineering)
2.2.2 什么是特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
意义:会直接影响机器学习的效果
sklearn:对于特征的处理提供了强大的接口 用于特征工程
pandas:一个数据读取非常方便以及基本的处理格式的工具 用于数据清洗、数据处理
- 特征抽取/特征提取
- 机器学习算法 - 统计方法 - 数学公式
- 文本类型 -》 数值
- 类型 -》 数值
- 机器学习算法 - 统计方法 - 数学公式
特征工程包含内容:
- 特征抽取
- 特征预处理
- 特征降维
2.3 特征抽取
2.3.1 特征提取
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
注: 特征值化是为了计算机更好的去理解数据
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习将介绍)
2.3.2 字典特征提取 - 类别 -> one-hot编码
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
vector 数学:向量 物理:矢量
矩阵 matrix 二维数组
向量 vector 一维数组
父类:转换器类 transfer
返回:sparse矩阵
API
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
对字典数据进行特征值化
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器。返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵。返回值:转换之前数据格式
- DictVectorizer.get_feature_names() 返回类别名称
示例
字典特征抽取
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}]
# 1.实例化一个转换器类
transfer = DictVectorizer()
# 2.调用fit_transform
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}]
# 1.实例化一个转换器类
transfer = DictVectorizer(sparse=False)
# 2.调用fit_transform
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
统计每个样本特征词出现的个数
API
sklearn.feature_extraction.text.CountVectorizer(stop_words=[])
对文本数据进行特征值化
返回词频矩阵
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象。 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵。返回值:转换之前数据格
CountVectorizer.get_feature_names() 返回值:单词列表
示例
文本特征提取,统计每个样本特征词出现的个数
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"]
# 1.实例化一个转换器类
transfer = CountVectorizer()
# 2.调用fit_transform
data_new = transfer.fit_transform(data)
# CountVectorizer是没有sparse参数的,不过这个'scipy.sparse.csr.csr_matrix'类里有toarray()方法,可以直接调用
# DictVectorizer也有toarray()方法
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 = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
# 1.实例化一个转换器类
transfer = CountVectorizer()
# 2.调用fit_transform
data_new = transfer.fit_transform(data)
# CountVectorizer是没有sparse参数的,不过这个'scipy.sparse.csr.csr_matrix'类里有toarray()方法,可以直接调用
# DictVectorizer也有toarray()方法
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 = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 1.将中文文本进行分词
data_new = []
for sent_text in data:
data_new.append(cut_words(sent_text))
# print(data_new)
# 2.实例化一个转换器类
transfer = CountVectorizer()
# 3.调用fit_transform
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
API
sklearn.feature_extraction.text.TfidfVectorizer
使用TF-IDF对文本数据进行特征值化
jieba.cut()
返回词语组成的生成器
示例
使用TF-IDF进行中文文本特征抽取
def tfidf_text_extract_chinese_auto():
"""tfidf中文文本特征抽取,自动分词"""
data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。",
"我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。",
"如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 1.将中文文本进行分词
data_new = []
for sent_text in data:
data_new.append(cut_words(sent_text))
# print(data_new)
# 2.实例化一个转换器类
transfer = TfidfVectorizer()
# 3.调用fit_transform
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])之间
缺点:鲁棒性较差
归一化异常值为最大值、最小值的时候,归一化结果描述数据不够准确。
应用场景:只适合传统精确小数据场景。
API
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():
"""归一化"""
# 1.获取数据
data = pd.read_csv("dating.txt") # 使用pandas库导入数据文件
# print("data:\n", data)
data = data.iloc[:, :3] # 获取所有行,前三列
print("data:\n", data)
# 2.实例化一个转换器类
transfer = MinMaxScaler() # 默认范围0-1
# transfer = MinMaxScaler(feature_range=[2, 3]) # 范围2-3
# 3.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
结果:
注意:
导入文件的时候需要使用pandas库
2.4.3 标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
(x - mean) / std
标准差:集中程度
应用场景:
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
API
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():
"""归一化"""
# 1.获取数据
data = pd.read_csv("../usingFiles/dating.txt") # 使用pandas库导入数据文件
# print("data:\n", data)
data = data.iloc[:, :3] # 获取所有行,前三列
print("data:\n", data)
# 2.实例化一个转换器类
transfer = MinMaxScaler() # 默认范围0-1
# transfer = MinMaxScaler(feature_range=[2, 3]) # 范围2-3
# 3.调用fit_transform
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.1 特征选择
定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
Filter过滤式
- 方差选择法:低方差特征过滤
特征方差小:某个特征大多样本的值比较相近
特征方差大:某个特征很多样本的值都有差别
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
删除所有低方差特征
Variance.fit_transform(X)
X:numpy array格式的数据[n_samples,n_features]
返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
- 皮尔逊相关系数(Pearson Correlation Coefficient)
反映变量之间相关关系密切程度的统计指标->特征与特征之间的相关程度
取值范围:–1≤ r ≤+1
皮尔逊相关系数
0.9942
特征与特征之间相关性很高:
1)选取其中一个
2)加权求和
3)主成分分析
API
sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
删除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
from scipy.stats import pearsonr
计算皮尔逊相关系数
- x : (N,) array_like
- y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
示例
过滤低方差特征,查看特征之间的相关性
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():
"""过滤低方差特征"""
# 1.获取数据
data = pd.read_csv("../usingFiles/factor_returns.csv") # 使用pandas库导入数据文件
data = data.iloc[:, 1:-2]
print("data:\n", data)
# 2.实例化一个转换器类
transfer = VarianceThreshold(threshold=5) # 删除方差低于threshold的特征
# 3.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new, data_new.shape)
# 4.计算某两个变量之间的相关性
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"]) # 列名来访问DataFrame里面的数据,参考https://www.jianshu.com/p/ebb64a159104
print("pe_ratio与pb_ratio相关系数:\n", r1)
r2 = pearsonr(data['revenue'], data['total_expense'])
print("revenue与total_expense相关系数:\n", r2)
结果:
Embeded嵌入式
决策树
正则化
深度学习
主成分分析
2.5.2 主成分分析(PCA)
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
应用:回归分析或者聚类分析当中
API
sklearn.decomposition.PCA(n_components=None)
将数据分解为较低维数空间
- n_components:
- 小数:表示保留百分之多少的信息
- 整数:减少到多少特征
- PCA.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
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]]
# 1.实例化一个转换器类
# n_components 小数表示保留百分之多少的信息 整数:减少到多少特征
transfer = PCA(n_components=2)
# 2.调用fit_transform
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
结果:
2.5.3 案例:探究用户对物品类别的喜好细分
用户 物品类别
user_id aisle
1)需要将user_id和aisle放在同一个表中 - 合并
2)找到user_id和aisle - 交叉表和透视表
3)特征冗余过多 -> PCA降维
示例
探究用户对物品类别的喜好细分降维
def homework():
"""探究用户对物品类别的喜好细分降维"""
# 1、获取数据集
# ·商品信息- products.csv:
# Fields:product_id, product_name, aisle_id, department_id
# ·订单与商品信息- order_products__prior.csv:
# Fields:order_id, product_id, add_to_cart_order, reordered
# ·用户的订单信息- orders.csv:
# Fields:order_id, user_id,eval_set, order_number,order_dow, order_hour_of_day, days_since_prior_order
# ·商品所属具体物品类别- aisles.csv:
# Fields:aisle_id, aisle
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")
# 2、合并表,将user_id和aisle放在一张表上
# 1)合并orders和order_products on=order_id tab1:order_id, product_id, user_id
# 左表,右表,默认内连接,按"order_id"字段进行合并
tab1 = pd.merge(orders, order_products, on=["order_id", "order_id"])
# 2)合并tab1和products on=product_id tab2:aisle_id
tab2 = pd.merge(tab1, products, on=["product_id", "product_id"])
# 3)合并tab2和aisles on=aisle_id tab3:user_id, aisle
tab3 = pd.merge(tab2, aisles, on=["aisle_id", "aisle_id"]) # 总的大表
# 3、交叉表处理,把user_id和aisle进行分组
table = pd.crosstab(tab3["user_id"], tab3["aisle"]) # 将大表分组
print("table.shape", table.shape) # (206209, 134)
# 4、主成分分析的方法进行降维
# 1)实例化一个转换器类PCA
transfer = PCA(n_components=0.95) # 减少至0.95的特征
# 2)fit_transform
data = transfer.fit_transform(table)
print("data.shape:", data.shape) # (206209, 44),较之前134个特征,明显减少了很多
结果:
特征减少了90个
机器学习概述与特征工程总结
分类算法
目标值:类别
1、sklearn转换器和预估器
2、KNN算法
3、模型选择与调优
4、朴素贝叶斯算法
5、决策树
6、随机森林
3.1 sklearn转换器和估计器
3.1.1 转换器
特征工程的父类
特征工程的接口称之为转换器
- 1 实例化 (实例化的是一个转换器类(Transformer))
- 2 调用fit_transform(对于文档建立分类词频矩阵,不能同时调用)
转换器调用有这么几种形式:
- fit_transform
- fit
- transform
fit_transform的作用相当于transform加上fit
例如在标准化中:
(x - mean) / std
- fit_transform()
- fit()->计算每一列的平均值、标准差
- transform()->(x - mean) / std进行最终的转换
3.1.2 估计器(estimator)
sklearn机器学习算法的实现
- 1 实例化一个estimator
- 2 estimator.fit(x_train, y_train) 计算
—— 调用完毕,模型生成 - 3 模型评估:
- 1)直接比对真实值和预测值
y_predict = estimator.predict(x_test)
比对:y_test == y_predict - 2)计算准确率
accuracy = estimator.score(x_test, y_test)
- 1)直接比对真实值和预测值
sklearn机器学习算法的实现
- 用于分类的估计器:
sklearn.neighbors k-近邻算法
sklearn.naive_bayes 贝叶斯
sklearn.linear_model.LogisticRegression 逻辑回归
sklearn.tree 决策树与随机森林 - 用于回归的估计器:
sklearn.linear_model.LinearRegression 线性回归
sklearn.linear_model.Ridge 岭回归 - 用于无监督学习的估计器
sklearn.cluster.KMeans 聚类
3.2 K-近邻算法
3.2.1 什么是K-近邻算法
K Nearest Neighbor
KNN核心思想:
你的“邻居”来推断出你的类别
K-近邻算法(KNN)原理
k = 1
容易受到异常点的影响
如何确定谁是邻居?
计算距离:
- 距离公式
- 欧氏距离
- 曼哈顿距离 绝对值距离
- 明可夫斯基距离
k值取值的影响
- k 值取得过小,容易受到异常点的影响
- k 值取得过大,样本不均衡的影响
性能
- 距离计算上面,时间复杂度高
K-近邻算法需要做什么样的处理
- 无量纲化的处理
标准化 - sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
n_neighbors:k值
API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm=‘auto’)
- n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
- algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’},可选用于计算最近邻居的算法:‘ball_tree’将会使用 BallTree,‘kd_tree’将使用 KDTree。‘auto’将尝试根据传递给fit方法的值来决定最合适的算法。 (不同实现方式影响效率)
API算法中关于距离的定义
KNeighborsClassifier()定义如下:
@_deprecate_positional_args
def __init__(self, n_neighbors=5, *,
weights='uniform', algorithm='auto', leaf_size=30,
p=2, metric='minkowski', metric_params=None, n_jobs=None,
**kwargs):
super().__init__(
n_neighbors=n_neighbors,
algorithm=algorithm,
leaf_size=leaf_size, metric=metric, p=p,
metric_params=metric_params,
n_jobs=n_jobs, **kwargs)
self.weights = _check_weights(weights)
注意:
- metric='minkowski’表示使用的是明可夫斯基距离
- 欧式距离和曼哈顿距离是明可夫斯基距离的特殊形式。当p=1时,为曼哈顿距离;p=2时,为欧式距离(默认)
3.2.3 案例:鸢尾花种类预测
- 1)获取数据
- 2)数据集划分
- 3)特征工程
标准化 - 4)KNN预估器流程
- 5)模型评估
示例
用KNN算法对鸢尾花进行分类
def knn_iris():
"""
用KNN算法对鸢尾花进行分类
:return:
"""
# 1.获取数据
iris = load_iris()
# 2.划分数据集
x_train, x_test, y_train, y_test, = train_test_split(iris.data, iris.target, random_state=6)
# 3.特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
# x_test进行的操作要和x_train的一致。如果再fit,标准差和方差就不一样了。默认训练集和测试集来自总体样本 有同样的均值和标准差
x_test = transfer.transform(x_test)
# 4.KNN算法预估器
estimator = KNeighborsClassifier(n_neighbors=3)
estimator.fit(x_train, y_train)
# 5.模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("比对真实值和预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_