- 把特征个数变少
- 特征构建时,很难保证特征是互相独立的,特征之间有信息的冗余
- 可以降低计算代价,提升计算性能
- 策略:
PCA
降维的策略有很多- 其中使用
SVD
分解是最简单和最方便的
SVD
:
Singular Value Decomposition
底层实现依赖的是特征分解,但是适合任何形状的矩阵eigen decomposition
特征分解 -- 方阵
- 线性降维
linear dimensionality reduction
- 把代降维的矩阵 右乘 转换矩阵
V
nn.Embedding
- 代码实现:
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer
from sklearn.neighbors import KNeighborsClassifier
import numpy as np
# 加载数据
X, y = load_breast_cancer(return_X_y=True)
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2,
random_state=0)
print(f"降维之前:{X_train.shape}")
# 进行PCA降维算法
class MyPCA(object):
"""
手写 PCA 算法
Principal Component Analysis
"""
def __init__(self, n_components):
self.n_components = n_components
self.n_features = None
def fit(self, X):
"""
训练模型
"""
# 类型转换
X = np.array(X)
# 参数校验
if X.ndim != 2 or X.shape[1] < 2:
raise ValueError("输入的特征X维度必须为2")
# 保存训练样本的特征个数
self.n_features = X.shape[1]
# 对特征进行SVD分解
U, S, Vt = np.linalg.svd(a=X)
# 保存转换矩阵 (n, n_components)
self.V = Vt[: self.n_components, :].T
def transform(self, X):
"""
数据转换
"""
# 类型转换
X = np.array(X)
# 参数校验
if X.ndim != 2 or X.shape[1] != self.n_features:
raise ValueError("输入的特征X维度必须为2,且必须与训练时的特征相同")
# 转换数据 (k, n) @ (n, n_components)
return X @ self.V
# 构建模型
pca = MyPCA(n_components=1)
# 训练模型
pca.fit(X=X_train)
# 转换数据
X_train = pca.transform(X=X_train)
X_test = pca.transform(X=X_test)
print(f"降维之后:{X_train.shape}")
# 构建模型
model = KNeighborsClassifier(n_neighbors=5)
# 开始训练模型
model.fit(X=X_train, y=y_train)
# 开始预测
y_pred = model.predict(X=X_test)
# 模型的评价
acc = (y_pred == y_test).mean()
print(acc)