【数据挖掘】特征化分析(信息增益)

前言

这是一个数据挖掘选修课的作业,要求是类概念描述和特征化分析,两个词连搜都搜不到,如果你不知道我写的是什么,说实话我也不知道…
使用的语言为python,是直接在Jupyter中写的,中间会有一些输出方便随时进行验证

数据预处理

导入库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from math import log

读取样本数据

# 读取三种癌症数据集进行分析,查看样本集的规模
BLCA = pd.read_csv(r'数据集/BLCA/rna.csv')
KIRC = pd.read_csv(r'数据集/KIRC/rna.csv')
LUAD = pd.read_csv(r'数据集/LUAD/rna.csv')
print(BLCA.shape)
print(KIRC.shape)
print(LUAD.shape)
(3217, 400)
(3217, 489)
(3217, 491)
# 查看其中一种样本数据的大致结构
BLCA.head(6)
gene_idTCGA-HQ-A2OFTCGA-GU-A767TCGA-ZF-AA4RTCGA-DK-A1ACTCGA-DK-A3ITTCGA-GC-A3RDTCGA-BT-A0YXTCGA-FD-A6TETCGA-E7-A5KE...TCGA-BT-A0S7TCGA-K4-A6FZTCGA-E5-A2PCTCGA-DK-AA6QTCGA-XF-AAMYTCGA-CU-A0YOTCGA-E7-A7PWTCGA-S5-A6DXTCGA-GD-A76BTCGA-ZF-AA4V
0A2BP1|54715-0.402918-1.236959-1.453230-1.211589-1.288438-1.262086-1.033565-1.183245-1.076254...-1.282740-1.023637-0.366722-1.161285-1.380649-1.205136-0.875586-1.059148-1.393928-1.215641
1A2ML1|1445680.7175020.7378911.5846431.4719320.4140151.8210842.5158980.7238300.668703...0.1639031.3182290.8791350.5136031.5715571.6791991.222708-0.0798021.4803931.947340
2ACTL6B|51412-1.185185-1.403906-1.453230-1.211589-1.288438-1.262086-1.196075-1.183245-0.937518...-1.282740-1.291842-1.036778-1.161285-1.380649-1.368904-1.567590-1.425863-1.393928-1.215641
3ADAM6|87550.3738261.4112792.0922823.1864382.9674571.4371132.7237752.3200120.736963...2.3754131.9643691.2020001.8244192.1850512.1758491.4463523.5918723.2668182.514385
4ADAMDEC1|27299-0.489828-0.894004-0.2051691.0151790.0895400.1149030.6644650.138955-1.076254...-0.408256-0.063113-0.1471730.177490-0.2540070.173888-0.9517120.5927500.2603820.758897
5ALDH1A3|2200.4201700.5634041.0642570.4608611.5182041.8093201.2309121.4882750.809302...1.1800981.7519190.0348351.5120290.8514591.6452710.3982170.599149-0.0642561.339531

6 rows × 400 columns

# 对三种癌症样本数据进行转置,之后每一行表示一个样本数据,每一列表示一个样本特征
BLCASet = BLCA.T
BLCASet = BLCASet.iloc[1:,:].astype('float32')
KIRCSet = KIRC.T
KIRCSet = KIRCSet.iloc[1:,:].astype('float32')
LUADSet = LUAD.T
LUADSet = LUADSet.iloc[1:,:].astype('float32')
BLCASet.shape
BLCASet.head(6)
0123456789...3207320832093210321132123213321432153216
TCGA-HQ-A2OF-0.4029180.717502-1.1851850.373826-0.4898280.420170-1.1851851.8414921.327818-0.301422...0.2758461.228001-0.959773-0.5305590.6370471.3397060.5203050.235093-0.3839920.795605
TCGA-GU-A767-1.2369590.737891-1.4039061.411279-0.8940040.563404-1.2369591.3099582.0158290.416162...0.3643311.484526-1.4039060.689511-0.4742660.3785060.9946470.7765980.3343630.577015
TCGA-ZF-AA4R-1.4532301.584643-1.4532302.092282-0.2051691.064257-1.2679460.2074750.764633-0.786075...1.3500111.031541-1.4532300.867536-0.1455150.2299901.2100680.3030780.9127200.709520
TCGA-DK-A1AC-1.2115891.471932-1.2115893.1864391.0151790.460861-0.9958341.5763760.546906-0.855604...0.6376911.190068-0.3486510.0346410.0309730.0939701.0895230.5838130.5031980.733853
TCGA-DK-A3IT-1.2884380.414015-1.2884382.9674570.0895401.518204-1.159105-0.0351451.5758490.220414...0.5981911.479815-1.2884380.921235-0.3077000.4860691.3115220.4831390.2625080.589681
TCGA-GC-A3RD-1.2620871.821084-1.2620871.4371130.1149031.809320-0.9936030.8784512.0582530.036055...1.0695561.383669-0.2155580.234100-0.3244770.3796891.323748-0.0261470.6381230.096817

6 rows × 3217 columns

# 首先对第一种癌症和后两种癌症进行区分,添加一列作为标签
BLCASet.insert(loc=3217, column=3217, value='BLCA')
KIRCSet.insert(loc=3217, column=3217, value='KIRC')
LUADSet.insert(loc=3217, column=3217, value='LUAD')
BLCASet.head(6)
0123456789...3208320932103211321232133214321532163217
TCGA-HQ-A2OF-0.4029180.717502-1.1851850.373826-0.4898280.420170-1.1851851.8414921.327818-0.301422...1.228001-0.959773-0.5305590.6370471.3397060.5203050.235093-0.3839920.795605BLCA
TCGA-GU-A767-1.2369590.737891-1.4039061.411279-0.8940040.563404-1.2369591.3099582.0158290.416162...1.484526-1.4039060.689511-0.4742660.3785060.9946470.7765980.3343630.577015BLCA
TCGA-ZF-AA4R-1.4532301.584643-1.4532302.092282-0.2051691.064257-1.2679460.2074750.764633-0.786075...1.031541-1.4532300.867536-0.1455150.2299901.2100680.3030780.9127200.709520BLCA
TCGA-DK-A1AC-1.2115891.471932-1.2115893.1864391.0151790.460861-0.9958341.5763760.546906-0.855604...1.190068-0.3486510.0346410.0309730.0939701.0895230.5838130.5031980.733853BLCA
TCGA-DK-A3IT-1.2884380.414015-1.2884382.9674570.0895401.518204-1.159105-0.0351451.5758490.220414...1.479815-1.2884380.921235-0.3077000.4860691.3115220.4831390.2625080.589681BLCA
TCGA-GC-A3RD-1.2620871.821084-1.2620871.4371130.1149031.809320-0.9936030.8784512.0582530.036055...1.383669-0.2155580.234100-0.3244770.3796891.323748-0.0261470.6381230.096817BLCA

6 rows × 3218 columns

计算过程

掌握知识有限,只知道如何计算两种类别的特征的信息增益,这里先对第一种和后两种癌症进行区分,之后再对后两种癌症做区分
把后两种癌症数据合并为一个数据集,并对它们做一些方便后续计算的处理

# 先对第一种和第二三种进行区分
First_Set = np.array(BLCASet)
Second_Set = pd.concat([KIRCSet,LUADSet],axis=0)
Second_Set = np.array(Second_Set)
First_Set
array([[-0.40291815996170044, 0.7175019979476929, -1.1851845979690552,
        ..., -0.38399189710617065, 0.7956054210662842, 'BLCA'],
       [-1.2369587421417236, 0.7378911972045898, -1.4039058685302734,
        ..., 0.33436259627342224, 0.5770151615142822, 'BLCA'],
       [-1.4532300233840942, 1.5846433639526367, -1.4532300233840942,
        ..., 0.9127196669578552, 0.7095199823379517, 'BLCA'],
       ...,
       [-1.0591480731964111, -0.07980185002088547, -1.4258626699447632,
        ..., -0.03409137204289436, 0.35402581095695496, 'BLCA'],
       [-1.3939282894134521, 1.4803926944732666, -1.3939282894134521,
        ..., 0.6251711845397949, 0.7505104541778564, 'BLCA'],
       [-1.2156405448913574, 1.9473400115966797, -1.2156405448913574,
        ..., 0.7588967680931091, 0.9871674180030823, 'BLCA']],
      dtype=object)

用来分类一个给定样本的期望信息的计算:
在这里插入图片描述

计算每个属性的熵

def I(s1, s2):
    if s1==0 or s2==0:
        return 0
    prob1 = float(s1/(s1+s2))
    prob2 = float(s2/(s1+s2))
    return -prob1*log(prob1,2)-prob2*log(prob2,2)

计算给定的样本分类所需要的期望信息

# 计算给定的样本分类所需要的期望信息
I_First_Second = I(len(First_Set), len(Second_Set))
I_First_Second
0.8684114715162274

要计算每种属性特征的信息增益,对于离散值,我们可以直接统计每种类型的数量,进而计算熵和信息增益,而样本数据集每种属性是连续的值而非离散,这里采取的处理方法是:对于要计算信息增益的属性,遍历其所有的属性值,以每个属性值为分界将数据分成大于该值和小于该值两部分,对划分后的数据进行信息增益的计算,遍历完当前属性的所有取值,得到以每个属性值为分界所计算得到的信息增益,取这些结果中最大的信息增益作为当前属性的信息增益值
定义上述计算的函数:

# 对于离散值的处理,采用取值的方式,分为大于该值和小于该值两类
def Feature_Gain(First_Set, Second_Set):
    Gain = np.zeros(len(First_Set[0])-2)
    divPointSet = np.zeros(len(First_Set[0])-2)
    for i in range(len(First_Set[0])-2):
        for j in range(len(First_Set)-1):
            maxG = float('-inf')
            divPoint = First_Set[j][i]
            s11 = 0
            s12 = 0
            featList = [example[0] for example in First_Set]
            for value in featList:
                if value < divPoint:
                    s11 = s11+1
                else:
                    s12 = s12+1
            s21 = 0
            s22 = 0
            featList = [example[0] for example in Second_Set]
            for value in featList:
                if value < divPoint:
                    s21 = s21+1
                else:
                    s22 = s22+1
            # 计算以divPoint划分下该属性的信息增益
            G = I_First_Second-\
                (s11+s21)/(len(First_Set)+len(Second_Set))*I(s11,s21)-\
                (s12+s22)/(len(First_Set)+len(Second_Set))*I(s12,s22)
            if G>maxG:
                Gain[i] = G
                divPointSet[i] = divPoint
                maxG = G
    return Gain, divPointSet

计算所有属性的信息增益

计算得到所有属性的信息增益

Gain, divPointSet = Feature_Gain(First_Set, Second_Set)

根据信息增益大小,根据大小对下标进行排序

tmp = np.argsort(Gain)
print(tmp)
[2073  515 1941 ... 1331 2299 2617]

以上排序结果说名,第2617个属性中存在令信息增益值最大的一个划分

Gain[2617]
0.018568131349944283
divPointSet[2617]
-1.2444435358047485
DataSet = pd.concat([BLCASet,KIRCSet,LUADSet],axis=0)

结果可视化

经过上述的计算,此时已经得到各属性可能的信息增益大小,可以利用可能信息增益较大的几种属性和可能信息增益较小的属性对几种癌症进行区分,对比它们的效果
选择可能信息增益较小的属性值对样本数据分布进行绘制

信息增益较大的属性下的结果

plt.figure(figsize=(10,6), dpi=80)
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.scatter(First_Set[:,2617],First_Set[:,2299],label='BLCA', c='red')
plt.scatter(Second_Set[:,2617],Second_Set[:,2299],label='KIRC/LUAD', c='green')
plt.xlabel('feature 2617')
plt.ylabel('feature 2299')
plt.legend(loc='upper right')
plt.show()

请添加图片描述

信息增益较小的属性下的结果

plt.figure(figsize=(10,6), dpi=80)
plt.xlim(-1,3)
plt.ylim(-1,3)
plt.scatter(First_Set[:,2073],First_Set[:,515],label='BLCA', c='red')
plt.scatter(Second_Set[:,2073],Second_Set[:,515],label='KIRC/LUAD', c='green')
plt.xlabel('feature 2073')
plt.ylabel('feature 515')
plt.legend(loc='upper right')
plt.show()

请添加图片描述

# 可以按照同样的思路对剩余的两种癌症进行区分
KIRC_Set = np.array(KIRCSet)
LUAD_Set = np.array(LUADSet)
I_KIRC_LUAD = I(len(KIRC_Set), len(LUAD_Set))
I_KIRC_LUAD
0.9999969833346999
Gain1, divPointSet1 = Feature_Gain(KIRC_Set, LUAD_Set)
tmp1 = np.argsort(Gain1)
print(tmp1)
[2659 1152 1156 ...  944    0 2781]
plt.figure(figsize=(10,6), dpi=80)
plt.xlim(-2,2)
plt.ylim(-2,2)
plt.scatter(KIRC_Set[:,2781],KIRC_Set[:,0],label='KIRC', c='red')
plt.scatter(LUAD_Set[:,2781],LUAD_Set[:,0],label='LUAD', c='green')
plt.xlabel('feature 2781')
plt.ylabel('feature 0')
plt.legend(loc='upper right')
plt.show()

请添加图片描述

plt.figure(figsize=(10,6), dpi=80)
plt.xlim(-1,2)
plt.ylim(1.5,4)
plt.scatter(KIRC_Set[:,2659],KIRC_Set[:,1152],label='KIRC', c='red')
plt.scatter(LUAD_Set[:,2659],LUAD_Set[:,1152],label='LUAD', c='green')
plt.xlabel('feature 2781')
plt.ylabel('feature 0')
plt.legend(loc='upper right')
plt.show()

请添加图片描述

写在后面

至于这样的结果能说明什么,比较信息增益较大和较小的特征下的数据绘制的结果来看,使用信息增益较小的数据绘制出的图像,两种类型的样本点“均匀”分布,换句话说就是很难区分开;而使用信息增益较大的特征数据绘制出的图像,虽然也没好到哪去(特征维数太多了),但直观上可以感到比前者更易区分两种样本类型(大概)。这时因为信息增益较大的特征,意味着其不确定性下降更大,即更易于将两种事物区分开。

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼树C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值