Baseline & EDA(一)

前期

 预先Baseline,后期在基础上优化提升。

大纲

  1. 导入函数工具箱,参数搜索、评价指标等
  2. 数据读取-浏览-统计信息浏览是(否有异常值)(对应的train和test统计值)
  3. 特征工程-特征与标签构建
    特征有非数值列做处理(one-hot等),特征筛选-提取非数值列,可以做多项式特征构建,Log各种生成,构建基于业务逻辑的特征,或RNN的特征。查问:特征加多了是否会过拟合?降维-噪声?效果是否更好?
    统计标签的基本分布信息。
  4. 统计及绘图
  5. 缺失值填补
  6. 模型训练与预测
    XGB进行五折交叉验证的参数效果/留一?
    手动调参看结果/网格搜索(数量和时间区别)
    或切分训练样本和预测样本
    预测结果的分析和处理,和之前的训练接可做对比分析。
  7. 模型融合
    加权融合(以得分为权重,误差小权重大)
  8. 输出结果
    csv

Baseline代码解析

导入工具箱
import numpy as np
import pandas as pd
import warnings
warnings.filterwarnings('ignore') #利用过滤器实现忽略警报
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sns
from scipy.special import jn
import time
%matplotlib inline
模型预测
from sklearn import linear_model #线性回归算法模型
from sklearn import preprocessing #预处理数据
from sklearn.svm import SVR #支持向量回归,区别于支持向量机
from sklearn.ensemble import RandomForestRegressor,GradientBoostingRegressor #随机森林梯度决策树
数据降维处理
from sklearn.decomposition import PCA,FastICA,FactorAnalysis,SparsePCA
#模型
import lightgbm as lgb
import xgboost as xgb
参数搜索和评价
from sklearn.model_selection import GridSearchCV,cross_val_score,StratifiedKFold,train_test_split
from sklearn.metrics import mean_squared_error, mean_absolute_error
读取数据
train_data = pd.read_csv(used_car_train_20200313.csv',sep=' ')
testA_data = pd.read_csv(used_car_testA_20200313.csv',sep=' ')
train_data.head().append(train_data.tail())
test_data.head().append(testA_data.tail())
#数据信息查看,info简要查看对应数据列名即NAN缺失信息
train_data.info()
#查看train列名
train_data.columns
数据统计信息浏览
#查看数值特征的统计信息
train_data.describe()
#缺失和异常值查看
train_data.isnull().sum()
testA_data.isnull().sum()
特征与标签构建
拆分并提取数值类型特征列名
numerical_cols = train_data.select_dtypes(exclude = 'object').columns
print(numerical_cols)
categorical_cols = train_data.select_dtypes(include = 'object').columns
print(categorical_cols)
构建训练和测试样本
#选择特征
feature_cols = [col for col in numerical_cols if col not in ['SaleID', 'name', 'regDate', 'model', 'brand', 'price', 'regionCode', 'seller', 'creatDate']]   
feature_cols = [col for col in feature_cols if 'Type' not in col]  
#提前特征列,标签列构造训练样本和测试样本
X_data = train_data[feature_cols]
Y_data = train_data['price']

X_test = testA_data[feature_cols]
print('X train shape:',X_data.shape)
print('X test shape:',X_test.shape)
#定义一个统计函数,方便后续信息统计
def Sta_inf(data):
    print('_min',np.min(data))
    print('_max',np.max(data))
    print('_mean',np.mean(data))
    print('_ptp',np.ptp(data))
    print('_std',np.std(data))
    print('_var',np.var(data))
统计标签的基本分布信息
print('Sta of label:')
Sta_inf(Y_data)
#绘制标签的统计图,查看标签分布
plt.hist(Y_data)
plt.show()
plt.close()
缺省值用-1填补
X_data = X_data.fillna(-1)
X_test = X_test.fillna(-1)
模型训练与测试
利用XGB进行五折交叉验证查看模型的参数效果
#xgb-Model
xgr = xgb.XGBRegressor(n_estimators=120,learning_rate=0.1,gamma=0,subsample=0.8,\
                      colsample_bytree=0.9,max_depth=7)#objective = 'reg:squarederror'
scores_train = []
scores = []
## 5折交叉验证方法
sk = StratifiedKFold(n_splits=5,shuffle=True,random_state=0)
for train_ind,val_ind in sk.split(X_data,Y_data):
    train_x = X_data.iloc[train_ind].values
    train_y = Y_data.iloc[train_ind]
    val_x = X_data.iloc[val_ind].values
    val_y = Y_data.iloc[val_ind]   
    
    xgr.fit(train_x,train_y)
    pred_train_xgb=xgr.predict(train_x)
    pred_xgb=xgr.predict(val_x)
    
    score_train = mean_absolute_error(train_y,pred_train_xgb)
    scores_train.append(score_train)
    score = mean_absolute_error(val_y,pred_xgb)
    scores.append(score)
    
print('Train mae:',np.mean(score_train))
print('Val mae:',np.mean(scores))
定义XGB和LGB模型函数
def build_model_xgb(x_train,y_train):
    model = xgb.XGBRegressor(n_estimators=150,learning_rate=0.1,gamma=0,subsample=0.8,\
                            colsample_bytree=0.9,max_depth=7)#objective = 'reg:squarederror'
    model.fit(x_train,y_train)
    return model
def build_model_lgb(x_train,y_train):
    estimator = lgb.LGBMRegressor(num_leaves=127,n_estimators = 150)
    param_grid ={
        'learning_rate':[0.01,0.05,0.1,0.2],
    }
    gbm = GridSearchCV(estimator,param_grid)
    gbm.fit(x_train,y_train)
    return gbm
切分数据集进行模型训练、评价和预测
##Split data with val
x_train,x_val,y_train,y_val = train_test_split(X_data,Y_data,test_size=0.3)
print('Train LGB...')
model_lgb = build_model_lgb(x_train,y_train)
val_lgb = model_lgb.predict(x_val)
MAE_lgb = mean_absolute_error(y_val,val_lgb)
print('MAE of val with lgb:',MAE_lgb)

print('Predict LGB...')
model_lgb_pre = build_model_lgb(X_data,Y_data)
subA_lgb = model_lgb_pre.predict(X_test)
print('Sta of Predict lgb:')
Sta_inf(subA_lgb)
print('Train XGB...')
model_xgb = build_model_xgb(x_train,y_train)
val_xgb = model_xgb.predict(x_val)
MAE_xgb = mean_absolute_error(y_val,val_xgb)
print('MAE of val with xgb:',MAE_xgb)

print('Predict XGB...')
model_xgb_pre = build_model_xgb(X_data,Y_data)
subA_xgb = model_xgb_pre.predict(X_test)
print('Sta of Predict XGB:')
Sta_inf(subA_xgb)
进行两模型的结果加权融合
#采取简单的加权融合方式
val_Weighted = (1-MAE_lgb/(MAE_xgb+MAE_lgb))*val_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*val_xgb
val_Weighted[val_Weighted<0]=10 # 由于我们发现预测的最小值有负数,而真实情况下,price为负是不存在的,由此我们进行对应的后修正
print('MAE of val with Weighted ensemble:',mean_absolute_error(y_val,val_Weighted))
sub_Weighted = (1-MAE_lgb/(MAE_xgb+MAE_lgb))*subA_lgb+(1-MAE_xgb/(MAE_xgb+MAE_lgb))*subA_xgb

## 查看预测值的统计进行
plt.hist(Y_data)
plt.show()
plt.close()
输出结果
sub = pd.DataFrame()
sub['SaleID'] = testA_data.SaleID
sub['price'] = sub_Weighted
sub.to_csv('./sub_Weighted.csv',index=False)
sub.head()

EDA

步骤

数据业务==>数据结构==>重要的实际意义特征==>异常/离群数据==>查看数据情况-试用合理模型。

方法

绘图方法
数据原始图;时序图;统计图(均值图、箱型图、小提琴图、直方图等);对比差异和相同点。
量化方法
偏度、峰度、方差等异常情况;取值范围
  1. 时序图
    随着时间的推移观察数据特点,例如周期性、震荡幅度、震荡宽度等。
  2. 直方图
    方便观察数据的分布范围,分布形状,以及分布幅度(离散)
  3. 密度曲线图
    概率密度函数,分布形状即间隔(连续)
  4. 箱型图
    方便查看数据的异常状况,以及不同数据间分布的对比。
    在这里插入图片描述
  5. 小提琴图
    进阶箱型图,可看出某个值附近分布的频率
    在这里插入图片描述

量化方法

相关性分析
  • 定类变量:名义型变量,例如性别、家庭身份,不具有数值意义。
  • 定序变量:不仅分类,还按某种特性排序,两值的差无意义,例如教育程度、收入能力、电影评级
  • 定距变量:可比较大小,差有意义的变量
    在这里插入图片描述
独立性分析

变量间无线性相关,还可能存在非线性关联。相对下述方法应用性比较强
在这里插入图片描述

对应步骤

  • describe()描述:查看异常值。
  • info()了解每列的type,有助于了解是否存在除了nan以外的特殊符号异常。
  • 判断缺失与异常:使用is_null函数查看缺失,value_counts函数查看数据情况。例如数值少到无影响可删除。
  • 绘制数据分布
    各种拟合方法,选择最适合的拟合方法处理。
  • 统计数值变量的相关性:皮尔曼相关系数(斯皮尔曼和卡方检验做非数值的):低级的模型需要剔除相关性强的特征,高级的例如XGB、随机森林等可以不剔除。
  • 统计特征的偏度与峰度:pandas自带。
  • 会址特征之间的关系图:根据定量方法看线性相关,pairplot可以看到更多的非线性相关。
  • 绘制类别特征分布图:各个特征之间的取值区别。value取值为0或1,y_test有很大的区分效果。

常见问题

Q1:回归对数据的分布有什么要求?
不同模型对数据分布要求不同,有个基本假设,例如每个样本假设属于独立同分布的;变量之间相互独立;自变量和应变量同分布;长尾分布中进行Log后,长尾影响会放大。
Q2:用随机森林做模型,需要怎么做特征工程?
做特征工程,再用模型试用,和其他模型做特征工程差不多。线性一般要做归一化,XGB、LGBM、随机森林不需要满足量纲一致;深度模型省去特征模型的步骤。
Q3:求偏度和峰度的目的
偏度(左偏、右偏)表示数据需要做特殊处理;峰度表示凸起的高度。
Q4:刚拿到数据时怎么筛选特征?
EDA的目的就是这个。
Q5:方差小/不平衡等等的标准是什么?
相对而言,一般凭自己的经验;或相对比较。
Q6:脱敏处理
映射方法或哈希表,未知。
Q7:数据集的划分与保留?
Task4建模中有详解
Q8:模型的选择?模型的融合?
Task4和Task5
Q9:整个数据挖掘用时最多?重难点?
特征工程
Q10:组队合作和管理迭代?
先做再组队,github可做管理迭代。
Q11:国外用外部数据?
提前很大的数据库训练好模型,将好的模型迁移训练,类似pretrain。
Q12:如何将规则引入模型?
一开始用简单的规则做预测(例如线性回归、中位数*权重),后期将规则当做特征放入模型里面,特征工程里面的特征进行融合放在模型里面。
Q13:如果测试集包含异常值如何处理?
不合符训练模型样本分布,先分析为何会异常?手动解决。
Q14:匿名特征可以用PCA降维吗?
PCA降维会损失特征(具体百度)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值