数据降维
特征选择
特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
特征选择原因:
- 冗余:部分特征的相关度高,容易消耗计算性能
- 噪声:部分特征对预测结果有负影响
主要方法
- Filter(过滤式):VarianceThreshold(方差Variance)
- Embedded(嵌入式):正则化、决策树
- Wrapper(包裹式)
- 其他特征选择方法-神经网络
from sklearn.feature_selection import VarianceThreshold
# 删除低方差的特征
# threshold 需要根据实际选取
var = VarianceThreshold(threshold=0.0)
data = var.fit_transform([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
print(data)
输出
[[2 0]
[1 4]
[1 1]]
主成分分析(PCA)
PCA(principal component analysis)是什么
本质:PCA是一种分析、简化数据集的技术
目的:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
应用场景:特征数量达到上百个的时候,考虑数据简化,此时,数据也会改变,特征数量也会减少
作用:可以削减回归分析或者聚类分析中特征的数量
高维度数据容易出现的问题:特征之间通常是线性相关的,此时就需要PCA
from sklearn.decomposition import PCA
# n_components为小数(0-1)表示百分比,动态指定保留多少特征 经验值:90%~95%
pca = PCA(n_components=0.9)
data = pca.fit_transform([[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]])
print(data)
[[ 1.28620952e-15 3.82970843e+00]
[ 5.74456265e+00 -1.91485422e+00]
[-5.74456265e+00 -1.91485422e+00]]
案例
https://www.kaggle.com/c/instacart-market-basket-analysis/data
用户对物品类别的喜好细分降维:
# 导入模块
import pandas as pd
from sklearn.decomposition import PCA
# 读取四张表数据
# 订单与商品信息
prior = pd.read_csv('./data/order_products_prior.csv')
# 商品信息
products = pd.read_csv('./data/products.csv')
# 用户的订单信息
orders = pd.read_csv('./data/orders.csv')
# 商品所属具体物品类别
aisles = pd.read_csv('./data/aisles.csv')
# 合并4张表到一张表 (用户-物品类别)
_mg = pd.merge(prior, products, on=('product_id', 'product_id'))
_mg = pd.merge(_mg, orders, on=('order_id', 'order_id'))
_mg = pd.merge(_mg, aisles, on=('aisle_id', 'aisle_id'))
# 查看合并表的前10行
print(_mg.head(10))
# 建立行、列数据,行是用户、列是物品类别
# 交叉表(特殊分组工具)
cross = pd.crosstab(_mg['user_id'], _mg['aisle'])
print(cross.head(10))
print(cross.shape)
# PCA主成分分析-列表中冗余信息较多
pca = PCA(n_components=0.9)
data = pca.fit_transform(cross)
print(data.shape)
输出:
order_id product_id ... days_since_prior_order aisle
0 2 33120 ... 8.0 eggs
1 26 33120 ... 7.0 eggs
2 120 33120 ... 10.0 eggs
3 327 33120 ... 8.0 eggs
4 390 33120 ... 9.0 eggs
5 537 33120 ... 3.0 eggs
6 582 33120 ... 10.0 eggs
7 608 33120 ... 12.0 eggs
8 623 33120 ... 3.0 eggs
9 689 33120 ... 3.0 eggs
aisle air fresheners candles asian foods ... white wines yogurt
user_id ...
1 0 0 ... 0 1
2 0 3 ... 0 42
3 0 0 ... 0 0
4 0 0 ... 0 0
5 0 2 ... 0 3
6 0 0 ... 0 0
7 0 0 ... 0 5
8 0 1 ... 0 0
9 0 0 ... 0 19
10 0 1 ... 0 2
(206209, 134)
# 特征减少到 27 个
(206209, 27)
机器学习算法分类
- 算法是核心,数据和计算是基础
- 找准定位,大部分复杂模型的算法设计都是算法工程师在做,而我们
- 分析很多的数据
- 分析具体的业务
- 应用常见的算法
- 特征工程、调参数、优化
- 我们应该怎么做
- 学会分析问题,使用机器学习算法的目的,想要算法完成何种任务
- 掌握算法基本思想,学会对问题用相应的算法解决
- 学会利用库或者框架解决问题
机器学习算法判别依据
数据的类型将是机器学习模型不同问题不同处理的依据
数据类型
- 离散型数据:由记录不同类别个体的数目所得到的数据,又称计数数据,所有这些数据全部都是整数,而且不能再细分,也不能进一步提高他们的精确度。
- 连续型数据:变量可以在某个范围内取任一数,即变量的取值可以是连续的,如,长度、时间、质量值等,这类整数通常是非整数,含有小数部分。
注:只要记住一点,离散型是区间内不可分,连续型是区间内可分
机器学习算法分类
监督学习:特征值+目标值
非监督学习:特征值
监督学习
概念:(英语:Supervised learning),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值称为回归),或是输出是有限个离散值(称作分类)。
- 分类—k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络**(目标值离散型)**
- 回归—线性回归、岭回归**(目标值连续型)**
- 标注—隐马尔可夫模型 (不做要求)
监督学习=输入数据有特征有标签,既有标准答案
分类问题
概念:分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果
分类问题应用:
分类在于根据其特性将数据“分门别类”,所以在许多领域都有广泛的应用
- 在银行业务中,构建一个客户分类模型,按客户按照贷款风险的大小进行分类
- 图像处理中,分类可以用来检测图像中是否有人脸出现,动物类别等
- 手写识别中,分类可以用于识别手写的数字
- 文本分类,这里的文本可以是新闻报道、网页、电子邮件、学术论文
回归问题
概念:回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。
回归问题的应用
回归在多领域也有广泛的应用
- 房价预测,根据某地历史房价数据,进行一个预测
- 金融信息,每日股票走向
无监督学习
概念:英语:Supervised learning,可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成.
- 聚类—k-means
无监督学习=输入数据有特征无标签,既无标准答案
机器学习开发流程
数据:
- 公司本身就有的数据
- 合作过来的数据
- 购买的数据
建立模型:根据数据类型划分应用种类
- 原始数据明确问题做什么
- 数据的基本处理:pd去处理数据(缺失值、合并表)
- 特征工程(特征进行处理)重要
- 找到合适算法去进行预测
- 模型的评估,判定效果,如果没有合格:
- 换算法 参数
- 特征工程
- 上线使用,以API形式提供
数据的划分和介绍
数据集的划分
机器学习一般的数据集会划分为两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
训练集与测试集的划分一般控制在 75%、25%
sklearn 数据集接口介绍
from sklearn.datasets import load_iris, fetch_20newsgroups, load_boston
li = load_iris()
print("获取特征值")
print(li.data.shape)
print("目标值")
print(li.target.shape)
print("特征描述")
print(li.DESCR)
获取特征值
(150, 4)
目标值
(150,)
特征描述
.. _iris_dataset:
from sklearn.datasets import fetch_20newsgroups, load_boston
# 获取量大的数据(新闻数据)
news = fetch_20newsgroups(subset='all')
print(len(news.data))
print(news.target.size)
from sklearn.datasets import fetch_20newsgroups, load_boston
# 波士顿房价
lb = load_boston()
print("获取特征值")
print(lb.data.shape)
print("目标值")
print(lb.target.shape)
print(lb.DESCR)
获取特征值
(506, 13)
目标值
(506,)
转换器与预估器
转换器
转换器类(Transformer)—实现了特征工程的API
例子:
from sklearn.preprocessing import StandardScaler
# 特征工程(标准化)
std = StandardScaler()
std.fit() # 输入数据,但不做事,计算均值、方差等
std.transform() # 进行数据的转换
std.fit_transform() = fit() + transform()
预估器(估计器)
估计器(estimator)—分类器和回归器都属于estimator—是一类实现了算法的API
用于分类的估计器
sklearn.neighbors
k-近邻算法sklearn.naive_bayes
贝叶斯sklearn.linear_model.LogisticRegression
逻辑回归
用于回归的估计器
sklearn.linear_model.LinearRegression
线性回归sklearn.linear_model.Ridge
岭回归
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
# fit, predict,score
knn.fit(x_train, y_train)
# 得出预测结果
print("预测的目标签到位置为:", knn.predict(x_test))
# 得出准确率
print("预测的准确率:", knn.score(x_test, y_test))