【educoder 机器学习】PCA

PCA ( principal components analysis )即主成分分析,是一种使用最广泛的数据降维算法。 PCA 的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。

本实训项目的主要内容是基于 python 语言实现 PCA 算法,并熟悉 sklearn 中提供的 PCA 接口来对数据进行降维。

第1关:维数灾难与降维

1.B C
2.C

第2关:PCA算法流程

任务描述

本关任务:复习教学平台讲义,补充 python 代码,完成 PCA 函数,实现降维功能。

import numpy as np

def pca(data, k):
    '''
    对data进行PCA,并将结果返回
    :param data:数据集,类型为ndarray
    :param k:想要降成几维,类型为int
    :return: 降维后的数据,类型为ndarray
    '''

    #********* Begin *********#
    #计算样本各个维度的均值
    u = np.mean(data, axis=0)
    #demean
    after_demean = data - u
    # 计算after_demean的协方差矩阵
    # after_demean的行数为样本个数,列数为特征个数
    # 由于cov函数的输入希望是行代表特征,列代表数据的矩阵,所以要转置
    cov = np.cov(after_demean.T)
    #eig函数为计算特征值与特征向量的函数
    #cov为矩阵,value为特征值,vector为特征向量
    value, vector =  np.linalg.eig(cov)
    #根据特征值value将特征向量vector降序排序
    vector_index = np.argsort(value)#np.argsort()将矩阵按照value排序,并返回排序后的下标
    #筛选出前k个特征向量组成映射矩阵P
    n = vector_index[-1:-(k+1):-1]# 从索引-1开始到索引-(k+1)停止,间隔为-1
    p = vector[:, n]#取前n个值
    #after_demean和P做矩阵乘法得到result
    result = after_demean.dot(p)
    return result
    #********* End *********#

第3关:sklearn中的PCA

任务描述

本关任务:你需要调用 sklearn 中的 PCA 接口来对数据继续进行降维,并使用 sklearn 中提供的分类器接口(可任意挑选分类器)对癌细胞数据进行分类。

from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier

def cancer_predict(train_sample, train_label, test_sample):
    '''
    使用PCA降维,并进行分类,最后将分类结果返回
    :param train_sample:训练样本, 类型为ndarray
    :param train_label:训练标签, 类型为ndarray
    :param test_sample:测试样本, 类型为ndarray
    :return: 分类结果
    '''

    #********* Begin *********#
    #构造一个将维度降至11维的PCA对象
    pca = PCA(n_components=11)
    #对数据进行降维
    train_sample = pca.fit_transform(train_sample)
    test_sample = pca.fit_transform(test_sample)

    clf = DecisionTreeClassifier(max_depth=10)
    clf.fit(train_sample, train_label)
    result = clf.predict(test_sample)
    return result
    #********* End *********#

第3关:偏差与方差

1.B

第4关:评估方法

1.D
2.B C D

第5关:精准率(查准率)与召回率(查全率)

import numpy as np

def precision_score(y_true, y_predict):
    '''
    计算精准率并返回
    :param y_true: 真实类别,类型为ndarray
    :param y_predict: 预测类别,类型为ndarray
    :return: 精准率,类型为float
    预测中正确的概率
    预测出的占真实的比率
    '''

    #********* Begin *********#
    tp = np.sum((y_true == 1)&(y_predict == 1))
    fp = np.sum((y_true == 0)&(y_predict == 1))
    precision = tp/(tp+fp)
    return precision
    #********* End *********#


def recall_score(y_true, y_predict):
    '''
    计算召回率并召回
    :param y_true: 真实类别,类型为ndarray
    :param y_predict: 预测类别,类型为ndarray
    :return: 召回率,类型为float
    正例被预测出来的准确率
    真实占预测的比率
    '''

    #********* Begin *********#
    tp = np.sum((y_true == 1)&(y_predict == 1))
    fn = np.sum((y_true == 1)&(y_predict == 0))
    recall = tp/(tp+fn)
    return recall
    #********* End *********#

第6关:ROC曲线与AUC

import numpy as np

def calAUC(prob, labels):
    '''
    计算AUC并返回
    :param prob: 模型预测样本为Positive的概率列表,类型为ndarray
    :param labels: 样本的真实类别列表,其中1表示Positive,0表示Negtive,类型为ndarray
    :return: AUC,类型为float
    '''

    #********* Begin *********#
    '''
    在 Python 3.x 中为了减少内存,
    zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。
    格式如下:
    a = [1,2,3],b = [4,5,6]
    list(zip(a,b)) = [(1, 4), (2, 5), (3, 6)]
    '''
    p_n_list = list(zip(prob,labels))
    p_n_list.sort(key=lambda x:x[0])#根据第0列预测概率进行排序
    rank_sum = 0#所有真实类别样本排列序号的总和
    M = 0#M 为真实类别为 Positive 的样本数量
    N = 0#N 为真实类别为 Negtive 的样本数量
    for i in range(len(p_n_list)):
        if p_n_list[i][1] == 1:
            rank_sum += i+1
            M += 1
        else:
            N += 1
    auc = (rank_sum - M*(M+1)/2)/(M*N)
    return auc
    #********* End *********#

第7关:sklearn中的分类性能指标

from sklearn.metrics import accuracy_score, precision_score, recall_score,roc_auc_score

def classification_performance(y_true, y_pred, y_prob):
    '''
    返回准确度、精准率、召回率、f1 Score和AUC
    :param y_true:样本的真实类别,类型为`ndarray`
    :param y_pred:模型预测出的类别,类型为`ndarray`
    :param y_prob:模型预测样本为`Positive`的概率,类型为`ndarray`
    :return:
    '''

    #********* Begin *********#
    return accuracy_score(y_true, y_pred),precision_score(y_true, y_pred),recall_score(y_true, y_pred),roc_auc_score(y_true, y_prob)
    #********* End *********#

你可能感兴趣的:(educoder,机器学习,机器学习,python,sklearn,数据挖掘,数据分析)