数据挖掘检查清单

高数据量先截取[:10000]10000~50000数据进行处理,所有流程运行无错误再运行百万千万数据量

可视化

1、地区坐标可视化

把训练集和数据集所有的lng和lat合并到一起,把那些城市外的坐标暂时去掉(不要删除总数据集,另外复制一份)

做kmeans训练,分成几类随便填,然后按照分类好的标签,按标签循环绘制

longitude = list(train['pickup_longitude']) + list(train['dropoff_longitude'])
latitude = list(train.pickup_latitude) + list(train.dropoff_latitude)
loc_df = pd.DataFrame({'lng':longitude,'lat':latitude})

#画出区域
xlim = [-74.03, -73.77]
ylim = [40.63, 40.85]

loc_df = loc_df[(loc_df['lng']>xlim[0])&(loc_df['lng']xlim[0])&(loc_df['lng']ylim[0])&(loc_df['lat']ylim[0])&(loc_df['lat']

一、数据探索

查看数据基本情况,发现数据存在的问题,针对问题制定下一步的数据清理和补充信息计划

1、多个信息在一列,需要分离
2、数据类型为字符串而不是数值 object not float

#查看数据维度和特征类型
print(f'数据维度:{df.shape}\n')
print(f'特征类型:{df.dtypes}\n')

3、查看数据各列频数分布
合并过少或过细分类(过少的合并为其他等等),多个信息在同一列需要分离,纠偏

#对比train和test各自分布
for column in data_all.columns[:-2]:
    fig = plt.figure(figsize=(10, 10))
    g = sns.kdeplot(data_all[column][(data_all["kind"] == "train")], color="Red", shade = True)
    g = sns.kdeplot(data_all[column][(data_all["kind"] == "test")], ax =g, color="Blue", shade= True)
    g.set_xlabel(column)
    g.set_ylabel("频数分布")
    g = g.legend(["train","test"])
    plt.show()

# 相关度矩阵
plt.figure(figsize=(20, 16))  # 指定绘图对象宽度和高度
colnm = train.columns.tolist()  # 列表头
mcorr = train[colnm].corr(method="spearman")  # 相关系数矩阵,即给出了任意两个变量之间的相关系数
mask = np.zeros_like(mcorr, dtype=np.bool)  # 构造与mcorr同维数矩阵 为bool型
mask[np.triu_indices_from(mask)] = True  # 角分线右侧为True
cmap = sns.diverging_palette(220, 10, as_cmap=True)  # 返回matplotlib colormap对象
g = sns.heatmap(mcorr, mask=mask, cmap=cmap, square=True, annot=True, fmt='0.2f')  # 热力图(看两两相似度)
plt.show()
#各列与因变量y相关性与分布
fcols = 2
frows = len(train.columns)
plt.figure(figsize=(5*fcols,4*frows))
i=0
for col in train.columns:
    i+=1
    ax=plt.subplot(frows,fcols,i)
    sns.regplot(x=col, y='target', data=train, ax=ax, 
                scatter_kws={'marker':'.','s':3,'alpha':0.3},
                line_kws={'color':'k'});
    plt.xlabel(col)
    plt.ylabel('target')
    
    i+=1
    ax=plt.subplot(frows,fcols,i)
    sns.distplot(train[col].dropna() , fit=stats.norm)
    plt.xlabel(col)

二、数据清洗

1、定义一个数据处理函数,模块化处理,基于第一步看到的问题进行处理

然后检查后,再次查看数据情况

2、数据缺失情况处理

对于预测影响显著的缺失,直接删除

对于缺失量特别大的,看一下规律进行填充(比如缺失的为距地铁站1000米以外的数据,就分为1000米以上和元数据,将1000米以上的给一个非常大的值表示距离很远)

#查看各列缺失情况
df.isnull().sum()

三、特征工程、及可以添加扩展的数据

1、是否在节假日、周末、早晚高峰时段

①整理一份csv 的节假日列表,转为日期格式,分离月和日

holiday = pd.read_csv('NYC_2016Holidays.csv',sep=';')
holiday['Date'] = holiday['Date']+' '+'2016'
        #字符串转datetime
holidays = [datetime.strptime(holiday.loc[i,'Date'], '%B %d %Y').date() for i in range(len(holiday))]

②判断是否在工作日和假期中,返回True和False

def restday(yr,month,day,holidays):
    '''
    Output:
        is_rest: a list of Boolean variable indicating if the sample occurred in the rest day.
        is_weekend: a list of Boolean variable indicating if the sample occurred in the weekend.
    '''
    #新建两个空变量
    is_rest    = [None]*len(yr)
    is_weekend = [None]*len(yr)
    i=0
    for yy,mm,dd in zip(yr,month,day):        
        is_weekend[i] = date(yy,mm,dd).isoweekday() in (6,7)#isoweekday可以把datetime中返回1~7的星期,in 表示在...之中
        is_rest[i]    = is_weekend[i] or date(yy,mm,dd) in holidays# holidays是之前建立的假日情况表
        i+=1
    return is_rest,is_weekend

#训练集和测试集都处理一次
rest_day,weekend = restday(train['year'],train['month'],train['days'],holidays)
train['rest_day'] = rest_day
train['weekend'] = weekend

rest_day,weekend = restday(test['year'],test['month'],test['days'],holidays)
test['rest_day'] = rest_day
test['weekend'] = weekend

③白天、夜晚、早晚高峰
注意这里是24小时制!

for df in (train,test):

    df['hr_categori'] = np.nan
    df['hr_categori'][(df['rest_day'] ==False)(df['hr']<=9)&(df['hr']>=7)] = 'rush'
    df['hr_categori'][(df['rest_day'] ==False)(df['hr']<=18)&(df['hr']>=16)] = 'rush'
    df['hr_categori'][(df['rest_day'] ==False)(df['hr']<16)&(df['hr']>9)] = 'day'
    df['hr_categori'][(df['rest_day'] ==False)(df['hr']<7)&(df['hr']>18)] = 'night'
    df['hr_categori'][(df['rest_day'] ==True)(df['hr']<18)&(df['hr']>7)] = 'day'
    df['hr_categori'][(df['rest_day'] ==True)(df['hr']<=7)&(df['hr']>=18)] = 'night'

2、数据对应时段的天气信息

分离年、月、日、小时、分钟,
然后将有影响的天气信息合并到主数据中(按月日小时或年月日小时),最后如果不需要分组就把分组除以60加到原先主数据的小时中
可以加入是否是下雪天,下雨天等信息

weather['snow'] = 1*(weather.Events=='Snow') + 1*(weather.Events=='Fog\n\t,\nSnow')
weather['year'] = weather['Time'].dt.year
weather['month'] = weather['Time'].dt.month
weather['day'] = weather['Time'].dt.day
weather['hr'] = weather['Time'].dt.hour
weater = weather[weather['year']==2016][['month','day','hr','Temp.','Precip','snow','Visibility']]

3、区域平均XX(例:车速)

拼接所有经纬度坐标,使用kmeans训练数据分类
将分好类的类别标签添加到主数据上
按照分类标签计算XX(车速)的各条数据的车速
再按照分类标签计算各分类下平均速度
最后再合并到主数据上
多次merge记得改名,否则会变成xx_x xx_y

4、地址解析和空间数据有关联

拼接出具体地址,XX市XX区XX路XXX号等等,通过百度等API获取经纬度
然后根据城市各类设置的POI点位,根据房源所在位置的经纬度,匹配和计算房源周围的设置指标构建新的特征
500、1000、2000米范围内的地铁站、公交车站、三甲医院、重点学校、中学、幼儿园数量等。

5、时间序列相关特征构造

1、自相关特征
过去一段时间内某些时间点上的数据值,比如前一天,前两天....
2、时间窗特征
比如在过去一段时间内,某些或某个特征的聚合统计量,比如均值,方差,斜率,最大最小值,趋势等等
3、时间点特征
时间维度的特征,一年中某个季度、一年中某个月、每个月中第几天、每天的几点
4、周期性特征
特征在一个周期中的哪个阶段,以及这个阶段有哪些特征
还可以加一些 去年同一时刻的销量、方差/标准差、分位数等等统计量
5、外部特征
在业务上或经验上对预测值有影响的因素

四、数据预处理

1、箱形图查看要预测的列,处理离群值,超过1.5~3个标准差的值
最后查看列分布

#处理离群值用上下限填充
def boxplot_fill(col):
    # 计算iqr:数据四分之三分位值与四分之一分位值的差
    iqr = col.quantile(0.75)-col.quantile(0.25)
    # 根据iqr计算异常值判断阈值
    u_th = col.quantile(0.75) + 1.5*iqr # 上界
    l_th = col.quantile(0.25) - 1.5*iqr # 下界
    # 定义转换函数:如果数字大于上界则用上界值填充,小于下界则用下界值填充。
    def box_trans(x):
        if x > u_th:
            return u_th
        elif x < l_th:
            return l_th
        else:
            return x
    return col.map(box_trans)

2、getdummiy
3、各列相关性处理方式
与因变量y高相关特征,可以使用扩展polyfeatures,2次以上扩展特征,低相关度特征可以分箱再次使用(比如转化为bool型再getdummy,根据均值,是否大于当前均值)

print("找出最相关参数")
corr = train_data.corr()
corr.sort_values(["target"], ascending = False, inplace = True)
print(corr.target)

五、训练并优化模型

XGB训练后,查看特征排序,然后取重要性中位数,将中位数前一半的特征列名提取出来,进行进一步优化、参数搜索、及堆砌模型集成学习

模型指标:

-----代码待补充

将预测结果作为新列加入原数据再次学习

你可能感兴趣的:(数据挖掘检查清单)