头歌教学平台python与机器学习-PCA
第1关:维数灾难与降维
下列说法正确的是
B、
降维能够缓解维数灾难的负面影响
C、
使用原始数据训练出的回归器已经过拟合,可试试降维来提升性能
下列说法错误的是
C、
维数灾难不会引起过拟
第2关:PCA算法流程
在 begin-end 之间填写pca(data, k)函数,实现 PCA 算法,要求返回降维后的数据。其中:
data :原始样本数据,类型为 ndarray;
k :需要降维至 k 维,类型为 int。
注意:为了顺利评测,计算协方差矩阵时请使用 NumPy 提供的 cov 函数。import numpy as np
import numpy as np
def pca(data, k):
'''
对 data 进行 PCA,并将结果返回
:param data:数据集,类型为 ndarray
:param k:想要降成几维,类型为 int
:return:降维后的数据,类型为 ndarray
'''
# 去中心化
mean = np.mean(data, axis=0)
centered_data = data - mean
# 计算协方差矩阵
cov_matrix = np.cov(centered_data.T)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
# 对特征值进行排序,获取前 k 个最大特征值对应的特征向量
sorted_indices = np.argsort(eigenvalues)[::-1]
top_k_eigenvectors = eigenvectors[:, sorted_indices[:k]]
# 降维
reduced_data = centered_data.dot(top_k_eigenvectors)
return reduced_data
第3关:sklearn中的PCA
编程要求
在 begin-end 之间填写cancer_predict(train_sample, train_label, test_sample)函数实现降维并对癌细胞进行分类的功能,其中:
train_sample :训练样本,类型为 ndarray;
train_label :训练标签,类型为 ndarray;
test_sample :测试样本,类型为 ndarray。
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
def cancer_predict(train_sample, train_label, test_sample):
'''
使用 PCA 降维,并进行分类,最后将分类结果返回
:param train_sample: 训练样本, 类型为 ndarray
:param train_label: 训练标签, 类型为 ndarray
:param test_sample: 测试样本, 类型为 ndarray
:return: 分类结果
'''
# 使用 PCA 降维
pca = PCA(n_components=10)
train_sample_pca = pca.fit_transform(train_sample)
test_sample_pca = pca.transform(test_sample)
# 划分训练集和验证集
train_subsample, val_subsample, train_sublabel, val_sublabel = train_test_split(train_sample_pca, train_label, test_size=0.2, random_state=42)
# 训练逻辑回归模型
lr = LogisticRegression()
lr.fit(train_subsample, train_sublabel)
# 在验证集上评估
val_pred_proba = lr.predict_proba(val_subsample)[:, 1]
auc = roc_auc_score(val_sublabel, val_pred_proba)
if auc < 0.9:
# 如果 AUC 不满足要求,尝试调整 PCA 的参数或逻辑回归的参数
pca = PCA(n_components=8)
train_sample_pca = pca.fit_transform(train_sample)
test_sample_pca = pca.transform(test_sample)
lr = LogisticRegression(C=0.1)
lr.fit(train_sample_pca, train_label)
# 进行预测
prediction = lr.predict(test_sample_pca)
return prediction
本题中要求预测输出预测auc值高于0.9在后续的代码中作出相应修改,请读者看清题目。
作者:学习只是用户态