基于机器学习建模比赛的表和数据的处理

142 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

1. 建模比赛的步骤说明

  • 导入gc用来清理内存用的导入time和datetime用来处理时间用的
  • 将三张表读入,分别命名
  • 编写一个字典编码函数方便后续处理数据进行调用
  • 对时间进行编码(选择性处理)
  • 将测试集和训练集导出并进行内存清理(以防像上次一样电脑卡顿)
  • 划分连续字段和离散字段
  • 通过dtypes查看数据类型,将字符型离散字段进行字典排序编码
  • 通过isnull(). sum()来找到每一列的缺失值,缺失少的列可以补为—对 多的列进行中位数或者众数或者方差进行补
  • 对连续性字段的无穷值进行处理,用该列的最大值进行替换
  • 去除重复数据
  • 三表合一,只用一张表进行建模

2. 表和数据的处理

数据处理项目经验:(数据处理时需要用到python中的pandas和numpy)

  1. 第一步,将项目所需表头所在的总表读入并赋值,代码如下:
data_info =  pd.read_csv('***********.csv(此处输入的是表头总表所在的绝对路径)')
  1. 第二步,将所有表的相关表头信息分开从总表头表中提取出来并分别进行赋值
columns_info=data_info[data_info['文件名'] == '数据表名']['字段英文名']
columns_debit=data_info[data_info['文件名'] == '数据表名']['字段英文名']
columns_credit=data_info[data_info['文件名'] == '数据表名']['字段英文名']
  1. 第三步,将所需要处理的所有dat表进行读入训练集和测试集:
训练集:

df_basicinfo = pd.read_table('此处为dat表所在地址/表的名称.dat',sep='\|@\|',header = None,engine = 'python')
df_debit = pd.read_table('此处为dat表所在的地址/表的名称.dat',sep='\|@\|',header = None,engine = 'python')
df_credit = pd.read_table('此处为dat表所在的地址/表的名称.dat',sep='\|@\|',header = None,engine = 'python')

测试集:

test_a_basicinfo = pd.read_table('dat表所在的地址/表的名称.dat',sep='\|@\|',header = None,engine = 'python')
test_a_debit = pd.read_table('dat表所在的地址/表的名称.dat',sep='\|@\|',header = None,engine = 'python')
test_a_credit = pd.read_table('dat表所在的地址/表的名称.dat',sep='\|@\|',header = None,engine = 'python')

重要提示信息:
(可以讲dat表转化为csv表,转换方式为如下:)

import os
path_0 =r"此处为dat表所在的绝对路径"
path_1 = r"此处为转化为csv文件后所保存的路径"
filelist = os.listdir(path_0)
for files in filelist:
 
    dir_path = os.path.join(path_0, files)
    #分离文件名和文件类型
    file_name = os.path.splitext(files)[0] #文件名
    file_type = os.path.splitext(files)[1]  #文件类型
    print(dir_path)
    file_test = open(dir_path,'rb')
    #将.dat文件转为.csv文件
    new_dir = os.path.join(path_1,str(file_name)+'.csv')
    print(new_dir)
    file_test2 = open(new_dir,'w')
 
    for lines in file_test.readlines():
        #str_data = ",".join(lines.split('|@|'))
        #file_test2.write(str_data)
        str_lines=lines.decode('utf-8')
        file_test2.write(str_lines)
    file_test.close()
    file_test2.close()    
#if  file_type == '.dat':
#    file_test = open(dir_path,'rb')
#    #将.dat文件转为.csv文件
#    new_dir = os.path.join(path_1,str(file_name)+'.csv')
#    print(new_dir)
#    file_test2 = open(new_dir,'wb')
#    for lines in file_test.readlines():
#        lines=line.decode()
#        str_data = ",".join(lines.split('|@|'))
#        file_test2.write(str_data.encode("utf-8"))
#    file_test.close()
#    file_test2.close()
  1. 第四步,将表头分别在每张表中进行显示(以列表的形式)

df_basicinfo.columns = (list(columns_info))
df_credit.columns = (list(columns_credit))
df_debit.columns = (list(columns_debit))

test_a_basicinfo.columns = (list(columns_info_notarget))
test_a_credit.columns = (list(columns_credit))
test_a_debit.columns = (list(columns_debit))

注意: 1.删除列的时候为axis=0,删除行的时候axis=1 *.drop(,axis=0)

2.表名.describe()表示是查看表的信息

3.表名.shape表示的是查看表多少行和列 4.aa[‘cust_no’] == 85115,该句表示的是查找该表中值为85115 出现的次数

4.合并表的代码是pd.merge(表一,表二,on=“此处填写的是两张表之间通过哪个字段进行连 接,比如通过id”)

5.查看超过100列的表的所有列信息 m.info(verbose=True,null_counts=True) (m是表,该表大于100列)

  1. 第五步,对表中的数据进行处理,包括数字型以及类别型的特征,可以使用两种方式:

第一种方式:先将数字型和类别型的数据进行划分

numerical_fea = list(n.select_dtypes(exclude=['object']).columns)
category_fea = list(filter(lambda x: x not in numerical_fea,list(n.columns)))

然后对不同种类的数据进行处理

按照中位数填充数值型特征

n[numerical_fea] = n[numerical_fea].fillna(n[numerical_fea].median())