新手数据比赛中数据处理方法小结(python)

时间:2024-01-23 13:59:45

第一次参加,天池大数据竞赛(血糖预测),初赛排名1%。因为自己对python不熟悉,所以记录一下在比赛中用到的一些python方法的使用(比较基础细节,大佬绕道):

1.数据初探

data.info()
data.describe()

  使用上面两行代码,可以初步的看到整个数据的分布、缺失等情况

 

2.数据中存在性别是字符串表示的,使用map方法,将他数字化,当然也可以使用onehot。(python把字符串数据转变成数字)

data['性别'] = data['性别'].map({'男' :1,'女':0})

3.数据中日期的处理,这里有两种,一种是直接使用get_dummies(),或者如果使用的是lgb模型可以直接使用参数categorical_feature

另外一种就是计算两个日期之间的差值:(python计算日期的差值)

import time
import datetime

#日期标准化
data['体检日期'] = pd.to_datetime(data['体检日期'],format='%d/%m/%Y')
days =[]
for day in data['体检日期']:
      days.append((day-pd.to_datetime('2017-09-15')).days)
data['体检日期'] = days

  在比赛中有大佬开源了自己的代码,里面对于时间的处理是:

data['体检日期'] = (pd.to_datetime(data['体检日期']) - parse('2017-10-09')).dt.days

  但是,有些我在用这种方法做的时候发现,他对时间的识别很不准,比如数据如果是02-11-2017他会识别成2017年2月11日,但是其中的30-10-2017又识别的2017年10月30日。存在这种问题,所以用了之前的方法,把格式给指定,就不会出现这种问题了

4.pandas的dropna() 删除空值太多的列。在数据比赛中,竟然有大量的数据都是NAN,这时候如果太多的NAN的特征或者样本可以删除掉:

import pandas as pd
data.dropna(axis =1 ,thresh = 100,inplace = True)

  这里的参数解释:axis=1 表示删除的是列,如果是0则删除行,thresh=100表示如果空值超过100就删除这一列,inplace=True表示改变本身。还有参数how具体的可以参考文档:官方文档

5.使用pandas(python)读取含有中文字符的文件,在比赛中使用的数据特征名称都是中文,因为是医学词汇,看中文比较熟悉所以在读取的时候,需要指定格式:

import pandas as pd
data = pd.read_csv('...../data.csv',encoding = 'gb2312')

  使用encoding指定文档格式就可以了,如果不知道文档是什么格式,或者想转换格式,可以使用notepad++打开就可以转换格式了。

6.使用time包,记录算法运行的时间。因为要考虑到算法的时间效率,可以使用time包,计算时间:

import time
import datetime

print('开始训练.....')
T0 = time.time()
..
..
..
算法
..
..
..
print('训练用时{}秒.format(time.time() - T0))

  这样就能得到算法运行的用时了。

 

先写在这里,对于数据的可视化处理,还有很多很多的方法,细节不一一记录了。后面几项尤其是模型对比及可视化非常有帮助,等有空了再补上。

 

6.特征扩张

7.主成分析降维

8.归一化

9.模型数据对比

  9.1 K折模型预测数据图(预测值和真实值的图)

  9.2 K折模型预测数据图(拟合训练数据预测值与真实值的图)

  9.3 多种模型比较结果的正态分布(方法及代码)

10. xgb特征选择

11.三大相关系数(pearson、spearman、kendall)特征选择