import pandas as pd
China_train_path = '../China/train.csv'
China_test_path = '../China/test.csv'
data = pd.read_csv(China_test_path)
默认参数时,read_csv
的默认列名是数据的第一列,默认索引是自动生成的从0开始的。
对Dataframe每一列进行归一化处理,即映射到[0,1]这个区间上。
for i in range(len(dataMimic.columns)):
data.iloc[:,i] = (data.iloc[:,i]-data.iloc[:,i].min())/(data.iloc[:,i].max()-data.iloc[:,i].min())
这样可以应对不同列量纲不同的情况。
如果数据的每个特征的分布满足正态分布,即dataframe中的每一列满足正态分布,则有
数值分布在(μ-σ,μ+σ)中的概率为0.6826
数值分布在(μ-2σ,μ+2σ)中的概率为0.9544
数值分布在(μ-3σ,μ+3σ)中的概率为0.9974
其中μ为均值,σ为标准层(不是方差),如果不在(μ-3σ,μ+3σ)的范围内,可认为是异常值,有些时候这条错误数据不能继续使用,可以将其删除,有:
def dropAbnormal(data):
for i in data.columns:
data = data.drop(data[(data[i] >= data[i].mean()+3*data[i].std())|(data[i] <= data[i].mean()-3*data[i].std())].index)
return data
这里使用了drop
函数,其输入为行索引,然后利用了dataframe的索引技巧,满足大于μ+3σ或者小于μ-3σ的行被筛选出来,这两个条件使用|
链接。更多索引技巧可以看这篇博文。
当然如果想要简单的去除空值,可以使用df.dropna()
,具体看这篇博文。
首先介绍函数numpy.random.choice(a, size=None, replace=True, p=None)
本节以二分类问题为例,假设标签为0的数据要远多于标签为1的数据,函数underSample
从标签为0的数据中随机选择一部分,使得选择后的数据量与标签为1的数据量相同。
def underSample(data):
targetIndexArray = np.array(data[data['label'] == 0].index)
targetIndexArray = np.random.choice(targetIndexArray,size = len(data[data['label'] == 1]), replace=False)
anotherIndexArray = np.array(data[data['label'] == 1].index)
outIndexArray = np.concatenate((targetIndexArray,anotherIndexArray),axis = 0)
data = data.iloc[outIndexArray,:]
return data