学习笔记 -贝叶斯&数据清理

10.10学习笔记 -贝叶斯&数据清理

202210.10 主要学习了贝叶斯和数据清理基础知识,刷题Lintcode 667最长回文序列

数据清理

1.读取数据和保存数据

#包含pandas库
import pandas as pd

#读入名叫jiangsu的表,并命名为jiangsu

jiangsu = pd.read_excel('jiangsu.xls', index_col = 0)

#保存表。到work文件夹中,命名为jiangnewtable
jiangsu.to_csv('work/jiangnewtable.xls')                                                                                                                                                                                                                                                                                       

#显示表内容
jiangnewtable = pd.read_csv(filepath_or_buffer = r"work/jiangnewtable.xls",index_col=0)
jiangnewtable

读取表用的是Pandas库中的.read_csv()

摘自:https://blog.csdn.net/m0_46336403/article/details/119817479

jiangnewtable = pd.read_csv(filepath_or_buffer = r"work/jiangnewtable.xls",index_col=0)

这里主要注意的是index_col=0

  • index_col 默认值(index_col = None)——重新创建一列成为index值
  • index_col=False——重新创建一列成为index值
  • index_col=0——第一列为index值

数据清洗

#读入cpi表格,显示前四行
#在此填写程序
cpi = pd.read_excel('cpi.xls')
cpi_1 = cpi.iloc[:4,:]
cpi_1 

在这里插入图片描述

切片

这里仅粗略记录与这里代码相关的切片语法

这里涉及到python中非常重要的语法 — 列表切片

简单切片指的是这样的切片形式:a[start:stop],其行为是得到下标在这样一个前闭后开区间范围内的元素,其中start和stop为负数时,简单看作是负数下标对应的位置即可:

 >>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[2:3]
 [2]
 >>> a[5:9]
 [5, 6, 7, 8]
 >>> a[5:-1]
 [5, 6, 7, 8]
 >>> a[-5:9]
 [5, 6, 7, 8]
 >>> a[-5:-1]
 [5, 6, 7, 8]
扩展切片

早期的Python解释器仅支持上述a[start:stop]形式的基本切片,后来加入了下面要介绍的切片形式,扩展切片的名称也流传下来,实际上不用担心,这早已是Python所支持的标准语法。

扩展切片指的是这样的切片形式:a[start:stop:step],其中step是一个非零整数,即比简单切片多了调整步长的功能,此时切片的行为可概括为:从start对应的位置出发,以step为步长索引序列,直至越过stop对应的位置,且不包括stop本身。事实上,简单切片就是step=1的扩展切片的特殊情况。需要详细解释的是step分别为正数和负数的两种情况。

step为正数
当step为正数时,切片行为很容易理解,start和stop的截断和缺省规则也与简单切片完全一致:

 >>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[0:6:2]
 [0, 2, 4]
 >>> a[::2]
 [0, 2, 4, 6, 8]
 >>> a[:-2:2]
 [0, 2, 4, 6]
 >>> a[4::2]
 [4, 6, 8]

step为负数
当step为负数时,切片将其解释为从start出发以步长|step|逆序索引序列,此时,start和stop的截断依然遵循前述规则,但缺省发生一点变化,因为我们说过,在缺省的情况下,Python的行为是尽可能取最大区间,此时访问是逆序的,start应尽量取大,stop应尽量取小,才能保证区间最大,因此:

按照扩充索引范围的观点,start的缺省值是无穷大(​),stop的缺省值是无穷小(​)

 >>> a
 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 >>> a[5::-1]
 [5, 4, 3, 2, 1, 0]
 >>> a[:4:-2]
 [9, 7, 5]
 >>> a[::-1]
 [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

摘自:https://zhuanlan.zhihu.com/p/79541418

#提取并修改表中内容
cpi.columns = cpi.iloc[1]    # 
cpi = cpi[2:]    # ⑥
cpi.drop([11, 12], axis=0, inplace=True)    # ⑦
cpi['cpi_index'] = ['总体消费', '食品烟酒', '衣着', '居住', '生活服务', '交通通信', '教育娱乐', '医保', '其他']    # ⑧
cpi.drop(['指标'], axis=1, inplace=True)    # ⑨
cpi.reset_index(drop=True, inplace=True)    # ⑩
cpi.columns.rename('', inplace=True)    # ⑪
#保存表。到work文件夹中,命名为cpinewtable
cpi.to_csv('work/cpinewtable.xls') 

学习笔记 -贝叶斯&数据清理_第1张图片
cpi.drop([11, 12], axis=0, inplace=True) 是切去第11,12行,涉及到一个axis取值的问题,简单理解为axis=1为横向,axis=0为纵向inplace=True是覆盖原数据

摘自https://blog.csdn.net/weixin_45944896/article/details/118925846#:~:text=cpi.drop%20%28%5B%2011%2C%2012%20%5D%2C%20axis%3D,0%2C%20inplace%3DTrue%29%20%E5%88%A0%E9%99%A4%E7%AC%AC11%E3%80%8112%E8%A1%8C%EF%BC%8C%E5%B9%B6%E8%A6%86%E7%9B%96%E5%8E%9F%E6%9D%A5%E7%9A%84%20cpi.reset_index%20%28drop%3DTrue%2C%20inplace%20%3DTrue%29

绘图

#根据上面程序,画出第3行数据的图形
##在此填写程序
import matplotlib.pyplot as plt     # ⑬
r = plt.bar(cpi.iloc[3, :-1].index, cpi.iloc[3, :-1].values)     # ⑭
plt.grid()    # ⑮ 

这里绘图效果一般,理解大多来自底下的文章,但深知matplotlib.pyplot远非如此,抽空研究

摘自:https://blog.csdn.net/QLeelq/article/details/115702337

r = plt.bar(cpi.iloc[3, :-1].index, cpi.iloc[3, :-1].values) 

iloc函数使用方法:前面的冒号就是取行数,后面的冒号是取列数,其中数字遵循切片原则

摘自:https://blog.csdn.net/qq_39368111/article/details/110435536

plt.bar()是一个绘图函数,用于柱状图绘制,这里暂不展开说明

.摘自: https://zhuanlan.zhihu.com/p/113657235


决策树 - 熵

决策树模型中有个很重要的概念为熵(entropy),熵与信息内容的不确定程度有等价关系。

的概念对人工智能领域有很大的启发,模型(信息处理系统)在没有训练之前无法准确预测结果(虽然可以强行输出特征但输出的结果无法掌握),而模型经过训练后可以非常准确预测结果。

所以将模型的训练过程与熵的概念进行连接,即模型的训练过程可以看成是一个本来输出熵很大的系统(通俗来说就是瞎猜),经过人为训练逐步熵减,直到变成一个相对有序的过程(熵减的过程)。

import numpy as np

"""
    概率(概念):表示一个事件发生可能性的数字化度量
    
    pa = 0.3
    pb = 0.9
        
    信息量:
        - 听君一席话,胜读十年书!!!
        - 头条!!!
        - 爆炸性!!
        
        - 数字化!!!
        
        - 信息量的大小,如何用一个数来表达???
        
        - 明天,太阳将会从东方升起!---》 没有信息量
         
        - 大概率的事件发生了,没有信息量!!!
        - 小概率事件发生了,信息量很大!!!
        
        - 信息量的度量:概率
    
    - 信息熵
    - entropy
    - cross entropy 交叉熵损失函数
    - mse 均方误差损失函数
                                                                                                                                                                                                                                                                                                                                                                                                                                         - 混乱程度

       
        

"""

举个例子:分类三种小球

#小球分类问题
"""
    r: 30
    g: 30
    b: 30
"""
A = [30, 30, 30]

"""
    r: 45
    g: 45
    b: 0
"""
B = [45, 45, 0]

"""
    r: 90
    g: 0
    b: 0
"""
C = [90, 0, 0]

"""
    A的信息熵
"""
# 如何计算A的信息熵
a = np.array(A)

pa = a / a.sum()

这里就要用到一个很重要的公式:计算信息熵的公式
在这里插入图片描述

ea = -(0.3333 * np.log(0.333333) + 0.3333 * np.log(0.333333) + 0.3333 * np.log(0.333333))
# op:1.0985034273397427
# A
-(pa * np.log(pa)).sum()
# op:1.0985034273397427

# P(B)
pb = np.array([45, 45, 0])
pb = pb / pb.sum()

pb += 1e-6 # log不能为负
#op:0.6931603823628645
-(pb * np.log(pb)).sum()

-(pc * np.log(pc)).sum() # 其实就是0
# op:2.6631020616010977e-05

# 注意:还是那句话单独的0.6931603823628645不能说明混乱程度,需要和其他数值相比

以决策树为例

在这里插入图片描述

# 计算entropy
value = [42,39,46]
value = np.array(value)
p = value / value.sum()
-(p * np.log2(p)).sum()
# op:1.5816621019614714

这里有一些注意点

  • 为什么是x[2] <= 2.6?

    • 因为当特征是第二个的时候熵减得最快
  • 如何得知第二个特征熵减最快?

    • 遍历所有特征后得出

这里有三个重要的分类依据 —> ID3 C4.5 CART

这里着重介绍CART(分类回归树),其中最重要的思想就是将所有特征看作连续量

决策树优点

  • 解释性强(只有if else)
  • 推理性能强(很快)
  • 准确度很高
  • 最适合集成学习

缺点
如果让树自然生长,决策树会试图将每个数据送到最合适的地方,将导致非常严重的过拟合,进而出现了一个概念为剪枝,剪枝即强行停止决策树继续分类

Q:把一个样本分为2个子样本后,怎么认为降熵降的最多,是摸一个子分类的熵最小还是2个子分类的信息熵和?
A:都不是,要看加权和最小

你可能感兴趣的:(学习笔记,学习,python,pandas)