特征选择就是单纯地从提取到的所有特征中选择部分特征作为训练集特征,特征在选择前和选择后可以改变值、也不改变值,但是选择后的特征维数肯定比选择前小,毕竟我们只选择了其中的一部分特征。
特征选择原因:
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(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),可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值和目标值所组成。函数的输出可以是一个连续的值称为回归),或是输出是有限个离散值(称作分类)。
监督学习=输入数据有特征有标签,既有标准答案
概念:分类是监督学习的一个核心问题,在监督学习中,当输出变量取有限个离散值时,预测问题变成为分类问题。最基础的便是二分类问题,即判断是非,从两个类别中选择一个作为预测结果
分类问题应用:
分类在于根据其特性将数据“分门别类”,所以在许多领域都有广泛的应用
概念:回归是监督学习的另一个重要问题。回归用于预测输入变量和输出变量之间的关系,输出是连续型的值。
回归问题的应用
回归在多领域也有广泛的应用
概念:英语:Supervised learning,可以由输入数据中学到或建立一个模型,并依此模式推测新的结果。输入数据是由输入特征值所组成.
无监督学习=输入数据有特征无标签,既无标准答案
数据:
建立模型:根据数据类型划分应用种类
机器学习一般的数据集会划分为两个部分:
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))