百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

通过正则化和随机森林来选择特征

toyiye 2024-04-27 03:47 34 浏览 0 评论

一、为什么要做特征选择?

如果一个模型在训练数据上的表现比在测试数据上要好很多,这就表示这个模型过拟合了。过拟合是指模型的参数对于训练数据的特定观测值拟合的非常接近,而训练数据的分布于真实数据的分布并不一致,所以模型具有较高的方差。产生过拟合的原因是因为,对于训练数据集上的模型过于复杂,通常我们可以通过以下几种方式来降低过拟合:

1、收集更多的训练数据

2、通过正则化引入罚项

3、选择一个参数相对较少的简单模型

4、降低数据的维度

特征选择除了防止模型过拟合降低模型的泛化误差之外,它还可以减少硬件资源的损耗,降低模型的开发成本,减少训练的时间。下面我们会介绍通过正则化、随机森林算法进行特征选择。

二、使用L1正则化进行特征选择

常用的正则化有L1正则化和L2正则化,L1正则化和L2正则化都是为代价函数添加罚项,不同的是L1正则化增加的罚项是使用权重绝对值的和而L2正则化增加的罚项时权重的平方和。L1正则化生成的是一个稀疏的特征向量,且大多数的权值为0。如果数据集中包含了许多不相关的特征,尤其是不相关的特征数量大于样本的数量时,通过L1正则化处理之后能降低模型的复杂度。

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
if __name__ == "__main__":
data = pd.read_csv("G:/dataset/wine.csv")
#将data分为特征和类标
x,y = data.ix[:,1:],data.ix[:,0]
#对特征进行标准化处理
std = StandardScaler()
x_std = std.fit_transform(x)
#将数据集分为训练集和测试集
train_x,test_x,train_y,test_y = train_test_split(x_std,y,test_size=0.3,random_state=1)
#使用L1正则化进行特征选择
L1_model = LogisticRegression(penalty="l1",C=0.1)
L1_model.fit(train_x,train_y)
#判断模型在训练数据上的准确率
print("training accuracy:",L1_model.score(train_x,train_y))
#判断模型在测试数据上的准确率
print("test accuracy:",L1_model.score(test_x,test_y))

通过模型在训练集和测试集上的准确率可以发现,模型没有产生过拟合,因为训练集和测试集的准确率差不多。

1、查看模型的截距

#查看logistic模型的截距
print(L1_model.intercept_)

2、查看模型的权重系数

#查看模型的权重系数
print(L1_model.coef_)

因为我们使用的是多类别分类的logistic回归,所以它使用一对多(one-vs-Rest,OvR)的方法。第一个权重表示类别1相对于类别2和3的匹配结果,第二个权重表示的是类别2相对于类别1和3的匹配结果,第三个权重表示的是类别3相对于类别1和2的匹配结果。可以发现每一个权重都有13数,其中有很多项的值都为0,这是因为通过L1正则化之后产生的,这13个数表示模型在13个权重上的比重,对应不为0的特征系数,表示是选择的特征。

3、获取L1正则化所选择的列名

#获取特征的列名,因为第一列表示的酒的类别
data_cols_name = data.columns[1:]
#获取第一个特征的系数
coef1 = L1_model.coef_[0]
#获取一个特征系数的bool类型的数组,不为0为true
coef1_bool = coef1 != 0
print(data_cols_name[coef1_bool])
#获取第二个特征的系数
coef2 = L1_model.coef_[1]
coef2_bool = coef2 != 0
print(data_cols_name[coef2_bool])
#获取第三个特征的系数
coef3 = L1_model.coef_[2]
coef3_bool = coef3 != 0
print(data_cols_name[coef3_bool])

3、参数C对于L1正则化的影响

if __name__ == "__main__":
data = pd.read_csv("G:/dataset/wine.csv")
# 将data分为特征和类标
x, y = data.ix[:, 1:], data.ix[:, 0]
# 对特征进行标准化处理
std = StandardScaler()
x_std = std.fit_transform(x)
# 将数据集分为训练集和测试集
train_x, test_x, train_y, test_y = train_test_split(x_std, y, test_size=0.3, random_state=1)
fig = plt.figure()
ax = plt.figure(111)
colors = ["blue","green","red","cyan",
"magenta","yellow","black","pink",
"lightgreen","lightblue","gray","indigo",
"indigo","organge"]
weights,params = [],[]
for c in np.arange(-4,6):
model = LogisticRegression(penalty="l1",C=float(10)**c,random_state=0)
model.fit(train_x,train_y)
weights.append(model.coef_[1])
params.append(float(10)**c)
weights = np.array(weights)
for column,color in zip(range(weights.shape[1]),colors):
plt.plot(params,weights[:,column],label=data.columns[column+1],color=color)
plt.axhline(0,color="black",linestyle="--",linewidth=3)
plt.xlim([10**(-5),10**5])
plt.ylabel("weight coefficent")
plt.xlabel("C")
plt.xscale("log")
plt.legend(loc="upper left")
plt.show()

参数C是正则化参数

的倒数,,当C越小的时候,所有参数的权重都接近0。通过上面的图,我们可以发现特征与参数C的变化关系。

三、使用随机森林判断特征的重要性

使用随机森林来判断特征的重要性的时候,不需要考虑特征是否是线性可分的,也不需要对特征做归一化或者标准化处理。通过随机森林算法之后,可以知道每一个特征的重要性,特征的重要性之和为1。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
import numpy as np
if __name__ == "__main__":
data = pd.read_csv("G:/dataset/wine.csv")
#将data分为特征和类标
x,y = data.ix[:,1:],data.ix[:,0]
#将数据集分为训练集和测试集
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=0.3,random_state=1)
#定义一个由10000颗决策树组成的随机森林模型
rf_model = RandomForestClassifier(n_estimators=10000,random_state=0,n_jobs=-1)
#训练
rf_model.fit(train_x,train_y)
#获取特征的重要性
importances = rf_model.feature_importances_
#对特征的重要性进行排序
indices = np.argsort(importances)[::-1]
cols_name = data.columns[1:]
for f in range(train_x.shape[1]):
print("%2d) %-*s %f" % (f + 1,30,cols_name[f],importances[indices[f]]))
plt.title("特征的重要性")
plt.bar(range(train_x.shape[1]),importances[indices],color="lightblue",align="center")
plt.xticks(range(train_x.shape[1]),cols_name,rotation=90)
plt.xlim([-1,train_x.shape[1]])
plt.show()

相关推荐

Python随机模块22个函数详解(python随机函数的应用)

随机数可以用于数学,游戏,安全等领域中,还经常被嵌入到算法中,用以提高算法效率,并提高程序的安全性。平时数据分析各种分布的数据构造也会用到。random模块,用于生成伪随机数,之所以称之为伪随机数,是...

说冲A就冲A,这个宝藏男孩冯俊杰我pick了

爱奇艺新上架了一部网剧叫《最后一个女神》。有个惊人的发现,剧里男三居然是《青春有你》的训练生冯俊杰。剧组穷,戏服没几件,冯俊杰几乎靠一件背背佳撑起了整部剧。冯俊杰快速了解一下。四川人,来自觉醒东方,人...

唐山打人嫌犯陈继志去医院就医的背后,隐藏着三个精心设计的步骤

种种迹象表明,陈继志这帮人对处理打人之后的善后工作是轻车驾熟的,他们想实施的计划应该是这样的:首先第一步与伤者进同一家医院做伤情鉴定,鉴定级别最好要比对方严重,于是两位女伤者被鉴定为轻伤,他们就要求医...

熬夜会造成神经衰弱,别再熬夜了(熬夜会加重神经衰弱吗)

长时间熬夜会出现神经衰弱,皮肤受损,超重肥胖,记忆力下降等现象……熬夜了能补回来吗?每天少睡一两个小时算熬夜吗?必须上夜班怎么办?如何减少熬夜伤害?戳图转给爱熬夜的TA!via央视新闻来源:河北省文...

落叶知秋的图片爬取(落叶知秋的图片有哪些?)

importrequestsfrombs4importBeautifulSoupimporttimeimportjsonpathimportjsonfromurllib.parsei...

小心有毒!长沙海关查获藏匿在“巧克力威化涂层”中的大麻

来源:海关发布近日,长沙黄花机场海关对一票申报为“巧克力威化涂层”的进境快件进行机检查验时,在包裹内查获封装于各独立威化饼干包装袋中的大麻230克。另从其他申报为“巧克力、儿童早餐谷物”的快件中查获藏...

钧正平:编造传播这种谣言,荒谬(钧正公司)

来源:钧正平工作室官方微博【钧评编造传播这种谣言,荒谬!】目前,乌克兰安全形势还在迅速变化之中,各方面安全风险上升。相关事件网上热度极高,倍受瞩目。然而,有一些人却借机大肆制造散播一些低级谣言,比如...

幸运角色过去了,谈一谈DNF起源的元素

总的来说伤害比上个版本强太多了,打卢克每日和团本明显能感觉的到。目前打团B套+圣耀稍微打造下应该都能随便二拖了。组队基本上都是秒秒秒(以前得强力辅助,现在随便带个毒奶都行)。单刷除了王座和顶能源阿斯兰...

DNF元素超大凉打桩测试(把括号的伤害加起来好像比较正常)

最近修练场的二觉老是很奇怪,发现以前都是习惯性先减抗然后丢二觉,结果伤害。。。直接丢二觉就正常了下面是其他技能伤害,没达到BUG线,估计问题不大。装备打造方面:全身红字加起来353(41*5+74*2...

ANSYS接触和出图技巧(ansys rough接触)

1.ANSYS后处理时如何按灰度输出云图?1)你可以到utilitymenu-plotctrls-style-colors-windowcolors试试2)直接utilitymenu-plotctr...

ANSYS有限元使用经验总结-后处理(4)

28.求塑性极限荷载时,结构的变形应该较大,建议把大变形打开。...

CFopen21.1、CFopen21.2都来了(cfile open)

[呲牙][赞][加油]

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

取消回复欢迎 发表评论:

请填写验证码