周学习笔记(2021.8.2-2021.8.8)

本文详述了数据预处理的多种方法,包括异常值处理、特征筛选、正则化和数据分桶,强调了在分类任务中宏平均与微平均的区别以及CTR和CVR的概念。此外,介绍了模型调参的策略,如贪心调参、网格搜索、贝叶斯调参和随机搜索。最后,探讨了如何在数据竞赛中应用这些技巧构建模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

周学习笔记(2021.8.2-2021.8.8)

8.2

主要围绕datawhale二手车交易价格预测比赛学习内容

官方FAQ 突然发现官方FAQ(Frequently Asked Questions常见问题解答)都很棒,和其他大赛的FAQ不一样,以学习为主,能学到很多知识

1. 宏平均 & 微平均

参考博客

针对于多分类问题

宏取平均,微精确到个数

宏F1值有两个计算公式,具体留意比赛所给指标

2. typora 快捷键

ctrl+shift+m 插入公式

ctrl+i 倾斜

ctrl+u 下划线

3. CTR & CVR

(1)CTR

CTR(Click-Through-Rate)即点击通过率,是互联网广告常用的术语,指网络广告(图片广告/文字广告/关键词广告/排名广告/视频广告等)的点击到达率,即该广告的实际点击次数(严格的来说,可以是到达目标页面的数量)除以广告的展现量(Show content).


c t r = 点 击 次 数 点 击 量 ctr=\frac{点击次数}{点击量} ctr=
(2)CVR

CVR (Conversion Rate): 转化率。是一个衡量CPA广告效果的指标,简言之就是用户点击广告到成为一个有效激活或者注册甚至付费用户的转化率.
c v r = 点 击 量 转 化 量 cvr=\frac{点击量}{转化量} cvr=

4.评价指标

from sklearn.metrics import 
accuracy_score precision_score recall_score f1_score roc_auc_score
(y_true,y_pred)
#注:roc_auc_score(y_true,y_pred)只能计算AUC值,不能画ROC曲线

(1)分类任务

  • TP TN FN FP

  • acc precision recall(分子均为TP)

    acc容易受到样本数量以及样本是否均衡的影响

    precision (精确率)分母为所有预测为正例的样本 即TP+FP

    recall (召回率)分母为所有真实正例,即TP+FN——我们需要把没有预测正确但是本身是正例的样本找回来,即召回

  • f1

    精确率和召回率此消彼长,因此需要f1值进行调和

    二倍的和分之积

  • PR曲线 ROC曲线 AUC

    PR曲线中的P、R就是Precision、Recall

    ROC优点:正负样本分布不一致时,ROC曲线可以保持不变

  • logloss

    -(ylog§+(1-y)log(1-p))

    其中y表示样本的真实标签,p表示模型预测为正样本的概率

(2)回归任务

from sklearn.metrics import 
mean_squared_error mean_absolute_error r2_score
  • MAE(mean absolute error)平均绝对误差

  • MSE(mean squared error)均方误差

  • RMSE(root mean squared error)均方根误差(对MSE直接开根号)

    np.sqrt(mean_squared_error(y_true,y_pred))
    
  • MAPE (mean absolute percentage error)平均绝对百分比误差

    def mape(y_true,y_pred):
        return np.mean(np.abs((y_pred-y_true)/y_true))
    
  • R方

5.数值型变量分析异常值——data.describe()

不要仅仅觉得只有object类型可能存在异常值,info()中float、int中也可能存在异常值,value_counts不方便可能会太多,那可以用data.describe()

两个好处:迅速掌握数据的大概范围;99999或者-1这种奇怪的数字也可能是异常值,需要替换成np.nan

8.3

1. 有关回归问题的偏度和峰度

为什么要查看偏度和峰度?

偏度和峰度配合标准错误可以用来检验数据是否服从正态分布,是服从左偏还是右偏,还可以 根据他们之间的比采取合适的处理使之服从正态分布

.skew() 和 .kurt() 均可直接作用在Series类型上

正态分布(偏度=0),右偏分布(正偏分布,偏度>0)左偏分布(负偏分布,偏度<0)

正态分布(峰度值=0),厚尾(峰度值>0),瘦尾(峰度值<0)

低峰态数据集比较分散,极端数值较多;尖峰态数据集比较集中,两侧的数据比较少

在这里插入图片描述

2.高斯分布(正态分布)

为何目标变量要尽量符合高斯分布?

是因为有很多算法的前提假设是数据符合正态分布,例如线性回归里面最小二次法的一个前提假设就是数据符合正态分布

3. 类别特征严重偏斜

通常这样的特征对模型预测并不能起到什么作用,建议删除

不用针对每个特征都value_counts()

最快速直观的方法是可以绘制每个特征的【直方图】

4. 常用可视化图

参考博客

(1)条形图

x,y,data,hue,order参数同小提琴图和箱型图

sns.barplot(x="color",y="age",data=data)

在这里插入图片描述

关于图像的解释

Seaborn会对”color“列中的数值进行归类后按照**estimator参数**的方法(默认为平均值)计算相应的值,计算出来的值就作为条形图所显示的值(条形图上的误差棒则表示各类的数值相对于条形图所显示的值的误差)

关于误差线的解释

参考博客

误差线源于统计学,表示数据误差(或不确定性)范围,以更准确的方式呈现数据。误差线可以用标准差(standard deviation,SD)、标准误差(standard error,SE)和置信区间表示,使用时可选用任意一种表示方法并作相应说明即可。当误差线比较“长”时,一般要么是数据离散程度大,要么是数据样本少。

estimator 控制条形图绘制时取整列数据的什么值,默认平均值,还有中位数np.median

ci 置信区间(0-100),若设置为“sd",则使用标准差(默认为95%的置信区间)——与误差线有关

(2)计数图

​ countplot参数和barplot基本差不多,但count()不能同时输入x和y,且countplot没有误差线

(3)直方图+核密度估计图

​ 沿数据范围形成分箱,绘制条以显示落入每个分箱的观测次数的数据分布

​ 通过hist和kde参数调节是否显示直方图和核密度估计(默认hist、kde均为True)

​ fit 控制拟合的参数分布图形,能够直观地评估它与观察数据的对应关系

sns.distplot(x,color="g",hist=True,kde=True,fit=norm)
(4)核密度估计图

​ 直观看到样本本身的分布特征

​ shade 默认为False,表示无阴影

​ vertical 默认为False,表示以x轴绘制

sns.kdeplot(x,color="g")
(5)小提琴图

x,y,hue,data,order,palette(调色板),orient参数和箱型图用法相同

split 将其设置为true则绘制分拆的violinplot以比较经过hue拆分的两个量

fig,axes=plt.subplots(2,1)  
ax=sns.violinplot(x="color",y="age",data=data,hue="smoker",split=True,ax=axes[0]) 
ax=sns.violinplot(x="color",y="age",data=data,hue="smoker",ax=axes[1])  

在这里插入图片描述

inner 控制violinplot内部数据点的表示,有"box",“quartile”,“point”,"stick"四种方式

fig,axes=plt.subplots(2,2)
sns.violinplot(x="color",y="age",data=data,inner="box",ax=axes[0,0])  #小提琴图内显示箱型图(左上)
sns.violinplot(x="color",y="age",data=data,inner="quartile",ax=axes[0,1])  #钢琴图内显示四分位数线(右上)
sns.violinplot(x="color",y="age",data=data,inner="point",ax=axes[1,0])  #钢琴图内显示具体数据点(左下)
sns.violinplot(x="color",y="age",data=data,inner="stick",ax=axes[1,1])  #钢琴图内显示具体数据棒(右下)

在这里插入图片描述

scale 用于缩放每把小提琴的宽度,有area,count,width三种方式

fig,axes=plt.subplots(3,1)
sns.violinplot(x="color",y="age",data=data,scale="area",ax=axes[0]) #如果为"area",每把小提琴将有相同的面积(上图)
sns.violinplot(x="color",y="age",data=data,scale="count",ax=axes[1])  #如果为"count",小提琴的宽度将根据该小组中观察的数量来缩放(中图)
sns.violinplot(x="color",y="age",data=data,scale="width",ax=axes[2])  #如果为"age",每把小提琴将有相同的宽度(下图)

在这里插入图片描述

(6)箱型图

x,y dataframe中的列名(str)或者矢量数据

data dataframe或者数组

hue dataframe的列名,按照列名中的值分类形成分类的条形图

y应该看成目标属性,x为非目标属性,hue是另一个非目标属性。即两个变量嵌套groupby()

order 控制条形图(x轴)的顺序

sns.boxplot(x="color",y="pl",data=data,hue="catagory")

在这里插入图片描述

orient “v”|“h” 用于控制图像是水平还是竖直显示(一般当不传入x、y,仅传入data的时候使用

fig,axes=plt.subplots(2,1)
sns.boxplot(data=data,orient="v",ax=axes[0])
sns.boxplot(data=data,orient="h",ax=axes[1])

在这里插入图片描述

(7)缺失可视化
import missingno as msno
(8)可视化报告
import pandas_profiling
pfr=pandas_profiling.ProfileReport(Train_data)
pfr.to_file()

(9)同时呈现多张图
fig,axes=plt.subplots(1,3)
(10)热力图

center 颜色带的分界线

annot是否显示数值注释,默认为False;以及数值注释默认显示的是科学计数法的数值,太长看着会很乱,可以将数值格式化 fmt参数是format的缩写,fmt="d"整数

linewidths 控制每个小方格之间的间距

square bool类型,是否让每个单元格都是正方形,默认为False

sns.heatmap()

cbar_kws 关于颜色带的设置 ,默认纵向

cbar_kws={"orientation":"horizontal"} #横向显示颜色带

在这里插入图片描述

mask 传入布尔型矩阵,若矩阵内为True,则热力图相应的数据将会被屏蔽掉

# correlation coefficent 相关系数
corr=np.corrcoef(data) #生成数据集的相关系数矩阵
mask=np.zeros_like(corr) # 以corr的形状生成一个全为0的矩阵
mask[np.triu_indices_from(mask)] = True #将mask的对角线及以上设置为True
#np.triu_indices_from()得到的是序号
mask=mask #传入参数

在这里插入图片描述

(11)直方图

参考博客

bins控制直方图中划分的区间数,直接传入数字即可

color控制柱子的填充色

density参数默认为False,表示用每个区间的数值个数来绘图,当取值为True时,柱子的高度为每个区间的频率

orientation参数默认值为vertical,表示绘制竖着的柱子;horizontal时绘制水平的柱子

histtype 指定直方图的绘制类型,默认为bar,“step"表示边框的线条

plt.hist(x,bins,color,density,orientation,histtype)

在这里插入图片描述

(12)两两之间的关系 pairgrid()

kind 用于控制非对角线上图的类型,“scatter” “reg”

scatter散点图

"reg"会为非对角线的散点图拟合出一条直线

在这里插入图片描述

diag_kind 用于控制对角线上的图的类型,”hist"“kde” (diagonal)

hue一般为目标属性

在这里插入图片描述

vars 某两个或某多个变量的关系时,传入list参数

sns.pairplot(data,kind,diag_kind,hue,vars)

在这里插入图片描述

(13)多个变量之间的关系 facetgrid()

参考博客

先用sns.FacetGrid进行参数的调整,然后使用map的功能,直接绘制图像

注:map()函数传入两个参数,一个是函数名,一个是可以迭代的对象,比如列表、元组

col 传入非目标属性列名字符串,可将其按照字符串类别画图,一个图属于其中一个类别,横坐标也有用的

g=sns.FacetGrid(data,col="",hue="")
g.map(plt.scatter,"横坐标","纵坐标",alpha=)
#第二行语句中可以添加参数

sns.set(font_scale=2) #调节文中字体
# 在不同社会等级下,男性和女性在不同登陆港口下的数量对比
grid = sns.FacetGrid(data_all, col='Pclass', hue='Sex', palette='seismic', size=4)
# 'Embarked' 是  data_all (是一个 DataFrame) 中的字段
grid.map(sns.countplot, 'Embarked', alpha=.8)
# 在图表的右边会显示图例
grid.add_legend() 

在这里插入图片描述

5. 相关系数矩阵

data.corr()	#任意两个变量之间的相关系数

若想看非目标变量与目标变量之间的关系,可以直接索引相关系数矩阵中目标变量那一列,然后排序

correlation=data.corr()
correlation["price"].sort_values(ascending=False) #从大到小将相关性排序(仅是线性关系)
#ascending  代表升序的意思

8.4

1. str.cat()

参考博客

a列名称.str.cat(b列名称)

两列均是字符串类型才可以合并

可以在cat()中设置连接符,便于后续分开 sep=’ ’

此时可以将数值型变量转化为字符型

df['price']=df['price'].astype('str')
df['price']=df['price'].map(lambda x:str(x))

2. 特征筛选

好处:

1.降维,使模型泛化能力更强,减小过拟合

2.去除不相关特征,降低学习难度

参考博客

大多数情况下选择嵌入式方法进行特征筛选,过滤式也可以在最初看看相关系数

  • 过滤式(filter):先对数据进行特征选择,然后再训练学习器,常见的方法有 Relief/方差选择法/相关系数法/卡方检验法/互信息法

移除低方差的特征

相关系数排序,分别计算每个特征与目标变量之间的相关系数,设定一个阈值,选择相关系数大于这个阈值的特征

利用假设检验得到特征与输出值之间的相关性,比如卡方检验、T检验、F检验

利用互信息从信息熵的角度分析相关性

  • 包裹式(wrapper):直接把最终将要使用的**学习器的性能**作为特征子集的评价准则,常见方法有 LVM(Las Vegas Wrapper)

从初始特征集合中不断的选择特征子集,训练学习器,并根据学习器的性能来对子集进行评价,直到选择出最佳的子集

优点:从最终学习器的性能来看,包裹式比过滤式更好

缺点:需要多次训练学习器,计算开销比过滤式要大

最易想到的是穷举法、拉斯维加斯框架下(Las Vegas Wrapper)使用随机策略进行子集搜索。使用随机策略,每次特征子集评价都需要训练学习器,计算开销很大,存在弊端

因此通常采用贪心算法,如前向搜索(在最优的子集上逐步增加特征,直到增加特征不能再使模型性能提升为止),后向搜索,双向搜索(前向和后向相结合)

!pip install mlxtend

from mlxtend.feature_selection import SequentialFeatureSelector as SFS
from sklearn.linear_model import LinearRegression
sfs = SFS(LinearRegression(),
           k_features=10,
           forward=True,
           floating=False,
           scoring = 'r2',
           cv = 0)
x = data.drop(['price'], axis=1)
x = x.fillna(0)
y = data['price']
sfs.fit(x, y)
sfs.k_feature_names_ 

#output
('powerPS_ten',
 'city',
 'brand_price_std',
 'vehicleType_andere',
 'model_145',
 'model_601',
 'fuelType_andere',
 'notRepairedDamage_ja')
# 画出来,可以看到边际效益
from mlxtend.plotting import plot_sequential_feature_selection as plot_sfs
import matplotlib.pyplot as plt
fig1 = plot_sfs(sfs.get_metric_dict(), kind='std_dev')
plt.grid()
plt.show()

在这里插入图片描述

  • 嵌入式(embedding):结合过滤式和包裹式,学习器训练过程中自动进行了特征选择,常见的有 lasso 回归、岭回归、决策树

    在过滤式和包裹式特征选择方法中,特征选择和学习器训练过程有明显的分别。但是嵌入式将特征选择算法本身作为组成部分嵌入到学习算法里,即在学习器训练过程中自动地进行特征选择

    使用正则化,特征系数变为0,从而实现特征选择

    只有得到特征系数或者可以得到特征重要性的算法才可以作为嵌入式选择的基学习器

3. 截尾异常值

箱型图的上限 Q3+1.5IQR;下限Q1-1.5IQR

"""这里包装了一个异常值处理的代码,可以随便调用"""
def outliers_proc(data, col_name, scale=3):
    """
        用于截尾异常值, 默认用box_plot(scale=3)进行清洗,不是处理异常值,而是处理极端值
        param:
            data: 接收pandas数据格式
            col_name: pandas列名
            scale: 尺度
    """
    data_col = data[col_name]
    Q1 = data_col.quantile(0.25) # 0.25分位数
    Q3 = data_col.quantile(0.75)  # 0,75分位数
    IQR = Q3 - Q1
    
    data_col[data_col < Q1 - (scale * IQR)] = Q1 - (scale * IQR) #处理下限的数据
    data_col[data_col > Q3 + (scale * IQR)] = Q3 + (scale * IQR) #处理上限的数据

    return data[col_name]
 
num_data['power'] = outliers_proc(num_data, 'power')

​ 解读为什么scale通常为3

在这里插入图片描述

4. pd.to_datetime()

参考博客1

参考博客2

将object类型转化为datetime类型(时间类型),因此format参数是匹配原字符串形式

数据里有时间出错的格式,所以我们需要 errors=‘coerce’ 用途:遇到不能转换的设置为nan

两个datetime类型的变量相减获得天数,并对Series类型,dt.days转化

data['used_time'] = (pd.to_datetime(data['creatDate'], format='%Y%m%d', errors='coerce') - 
                            pd.to_datetime(data['regDate'], format='%Y%m%d', errors='coerce')).dt.days

5.round()

round(数值,保留小数位数)

6. 数据分桶的好处

(1)离散后稀疏向量内积乘法运算速度更快

(2)离散后的特征对异常值更具鲁棒性,因为某个异常值将被分到某个桶中了

(3)LR 属于广义线性模型,表达能力有限,经过离散化后,每个变量有单独的权重,这相当于引入了非线性,能够提升模型的表达能力,加大拟合

(4)离散后特征可以进行特征交叉,提升表达能力,由 M+N 个变量编程 M*N 个变量,进一步引入非线形,提升了表达能力

(5)特征离散后模型更稳定,如用户年龄区间,不会因为用户年龄长了一岁就变化

7.将字典转化为dataframe

字典里面嵌套字典,即字典元素也是字典,最外面的键做列名,里面的键做行名

8. data.columns

虽然不能引用,如果索引需要变成列表 tolist() 但是可以随时了解到数据列名

9. 画图第一步

f , ax = plt.subplots(figsize = (7, 7))

10. 减小大数据集内存的方法

参考博客1

参考博客2

#祖传函数,可以直接使用的
def reduce_mem_usage(df):
    """ iterate through all the columns of a dataframe and modify the data type
        to reduce memory usage.        
    """
    start_mem = df.memory_usage().sum()  #计算原dataframe数据内存
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in df.columns:
        col_type = df[col].dtype  #Series一列数据类型相同
        
        if col_type != object:  #如果不是字符串
            c_min = df[col].min()  #最小值
            c_max = df[col].max()  #最大值
            if str(col_type)[:3] == 'int':  #完整的类型是int64,取前3位
                #np.iinfo() 显示整数类型的机器限制
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max: 
                #如果可以在int8的范围内,就缩到np.int8
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
        else:
            df[col] = df[col].astype('category') #由object变为category类型

    end_mem = df.memory_usage().sum()  #转换后再计算内存大小
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem)) #内存变化百分比
    return df


sample_feature = reduce_mem_usage(pd.read_csv('data_for_tree.csv'))

11. dtype() & astype() &type()

参考博客

type() 返回**数据结构类型**

注意“结构”二字,是存储数据的

list、dict、tuple

dtype() 返回**数据类型**

由于list、dict可能包含不同的数据类型,因此不可以调用dtype()

np.array中要求所有元素属于同一数据类型,因此可调用dtype()

int64 float64 object

astype() 改变np.array中所有数据元素的数据类型

能用dtype()才能用astype()

注:Series的底层数据就是由ndarray构建的,区别在于Series有序号

12. 数据预处理中的正态分布

参考博客

13. np.iinfo()

参考博客

在这里插入图片描述

输出很奇葩,不过可以通过gfg.min() & gfg.max() 得到最小和最大值

14. category() & object()

参考博客

由object()变成category(),可以加快速度

15. reset_index()

替换原有的序列,重新排序,从0开始

两个重要的参数

drop参数,默认为False,删除原有的索引列置为True

inplace参数,想要在原数据上修改需要inplace=True

16. LinearRegession()参数

参考博客

LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=None)

fit_intercept:bool类型,是否有截距,如果没有则直线过原点;
normalize:是否将数据归一化;
copy_X:默认为True,当为True时,X会被copied,否则X将会被覆写;
n_jobs:默认值为1。计算时使用的核数

#查看训练的线性回归模型的截距(intercept)与权重(coef)
'intercept:'+ str(model.intercept_)

#从大到小 reverse表示逆转,因此true表示降序
sorted(dict(zip(continuous_feature_names, model.coef_)).items(), key=lambda x:x[1], reverse=True)

解读一下:

zip() 将对象中对应的元素打包成一个个元组,然后返回列表

dict() 可以使列表中的元组对变为字典的形式

.items() 返回列表,列表元素是元组

8.5

1.字典 d.values() & d.keys() & d.items()

前面都会有dict_values、dict_keys、dict_items前缀,括号里得到的是列表,使用list()函数即可得到纯列表

2. sorted() & sort()

(1)sort()

reverse参数控制升序降序,无返回值,直接在列表上操作

a=[1,4,88,5,2]
a.sort() #默认升序排序
a.sort(reverse=False) #等同于

(2)sorted()

同样有reverse参数,有返回值

b=sorted(a)

注意:函数中参数key的使用

当列表中的元素不再单一,若列表中包含元组或字典

【列表中包含元组】

key=lambda x:x[0] #按照第一个作为排序标准

【列表中包含字典】

按照字典中某个key值进行排序

key=lambda x:x[key值]

3.学习曲线 & 验证曲线

学习曲线是指在参数值确定的情况下,训练集和验证集的得分情况的对比,看模型状态欠拟合还是过拟合

复杂度曲线(验证集曲线)是展示某个参数在取不同值时候,训练集与测试集得分情况的对比

模型复杂度小,则会出现欠拟合

模型复杂度大,则会出现过拟合

4. np.nan_to_num()

nan not a number

使用0代替数组x中的nan元素,使用有限的数字代替inf元素

5. reshape(m,-1)

该函数只能作用在矩阵或者数组上,-1表示自动计算,即矩阵/数组中所有元素个数除以m

分别是行数和列数

6. 交叉验证函数返回值

from sklearn.model_selection import cross_val_score
from sklearn.metrics import mean_absolute_error,make_scorer
scores=cross_val_score(model,X=train_x,y=train_y,verbose=1,cv=5,
                       scoring=make_scorer(mean_absolute_error(y_true,y_pred)))

这个scores是有5个值的,因为cv=5

7. np.linspace()

生成等差数列,返回array类型

train_size=np.linspace(start,stop,num,endpoint,retstep,dtype,axis)

9.正则化L1 L2

参考博客

【L1 L2 正则化各是什么】

在这里插入图片描述

一般都会在正则化项前添加一个系数

【正则化的作用】

在这里插入图片描述

【稀疏模型】

稀疏模型将大量的冗余变量去除,只保留与响应变量最相关的解释变量

简化了模型的同时却保留了数据集中最重要的信息,有效地解决了高维数据集建模中的诸多问题

稀疏模型具有更好的解释性,便于数据可视化、减少计算量和传输存储

稀疏模型和特征选择有关,因为如果系数是或者很小的数,即使去掉对模型也没什么影响

9. split()

返回按照分隔符分割好的列表

10. MLP(多层感知机)

11. 掌握GBDT三种模型的参数

xgboost

catboost

lightgbm

12. 模型调参

(1)贪心调参(坐标下降)

步骤:针对每个参数建立列表,列表元素为参数可选项;针对每个参数建立字典,存储参数值和当前交叉验证平均值

#示例,调LGBMRegressor()
best_obj = dict()
for obj in objective:
    model = LGBMRegressor(objective=obj)
    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))
    best_obj[obj] = score
    
best_leaves = dict()
for leaves in num_leaves:
    model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0], num_leaves=leaves)
    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))  #对于每一个参数是五折取的平均值
    best_leaves[leaves] = score
    
best_depth = dict() #该类型参数的字典,每一个键值对,键对应一个分数
for depth in max_depth:
    model = LGBMRegressor(objective=min(best_obj.items(), key=lambda x:x[1])[0],
                          num_leaves=min(best_leaves.items(), key=lambda x:x[1])[0],
                          max_depth=depth)
    score = np.mean(cross_val_score(model, X=train_X, y=train_y_ln, verbose=0, cv = 5, scoring=make_scorer(mean_absolute_error)))
    best_depth[depth] = score
(2)网格搜索

网格搜索的实质是组装,将每一个变量的可能取值进行组合,参数少还可,但是参数多将很费时,可以先定大范围,再筛选

clf 是 classifier 的缩写

parameters={'objective':objective,'num_leaves':num_leaves,'max_depth':max_depth}
model=LGBMRegressor()
clf=GridSearchCV(model,parameters,cv=5) #选出最好的模型
clf=clf.fit(train_X,train_y)

【常用属性】

clf.best_params_ 描述已取得最佳结果的参数组合
clf.best_score_ 提供优化过程中观察到的最好的评分

(3)贝叶斯调参

【待完善】

优点:采用高斯过程,考虑之前的信息,不断的更新先验,而网格搜索未考虑之前的参数信息

贝叶斯调参迭代次数少,速度慢

(4)随机搜索 RandomizedSearchCV

8.6

1. 数据竞赛——模型

(1)人为指定模型参数

将数据处理完可以直接放入模型中的类型——>设定模型参数,返回值记为model

model=LinearRegression(normalize=True)

——>用模型训练带有标签的数据(训练集),再次记录返回值

model=model.fit(train_x,train_y)

——>使用该模型进行预测(人为指定的是超参数,还有一部参数是在fit中学到的)

(2)自动化调参确定最佳的超参数组合

8.7

1. LOOCV & K-foldCV

cv cross validation 交叉验证

参考 DataWhale

bias 和 variance 的trade-off 含义是 偏差和方差的权衡

其实LOOCV是一种特殊的K-fold Cross Validation(K=N)。最后K的选取是一个**Bias和Variance的trade-off**。K越大,每次投入的训练集的数据越多,模型的Bias越小。但是K越大,又意味着每一次选取的训练集之前的相关性越大(考虑最极端的例子,当k=N,也就是在LOOCV里,每次都训练数据几乎是一样的)。而这种大相关性会导致最终的test error具有更大的Variance。一般K值选择5或10。

2. GridSearchCV 补充

实质是暴力搜索,该方法在小数据集有效,大数据集并不适用。数据量大可以使用一个快速调优的方法——坐标下降,实质上是一种贪心算法,拿当前对模型影响最大的参数调优,达到最优解后再拿下一个对模型影响较大的参数进行调优,直到所有的参数调整完毕

优点:省时省力

缺点:调到局部最优而不是全局最优

8.8

没学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值