sklearn 输出特征权重variancethreshold怎么知道去掉的特征是哪些

《Python数据分析》升级版 - 小象学院 - 互联网新技术学习平台|人工智能|大数据|机器学习|深度学习|Python|Java|Hadoop|Spark|Linux|MySQL|数据分析
第九讲:项目实战
过拟合与欠拟合
交叉验证及参数调整
评价指标补充
项目实战:通过移动设备行为数据预测性别年龄
过拟合(Overfitting):
是指在调适一个统计模型时,过多参数。模型对于训练数据拟合程度过当,以至太适应训练数据而非一般情况。
在训练数据上表现非常好,但是在测试数据或验证数据上表现很差。
此情况时使用交叉验证来确定超参数,防止过拟合。
欠拟合(Underfitting):
模型在训练和预测时表现都不好的情况;
欠拟合很容易被发现;
代码示例:
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# 加载数据
digits = load_digits()
X = digits.data
y = digits.target
# gamma=0.001
train_sizes, train_scores, val_scores = learning_curve‘绘制学习曲线,scikit-learn中自带模块’(
SVC(gamma=0.001超参数), X, y, cv=10, scoring='accuracy',指定评价指标,这是做分类时用
train_sizes=[0.1, 0.25, 0.5, 0.75, 1])表示将选取训练样本的百分之多少,就是括号里指定的,依次进行训练,依次观察训练效果
# cv=10在10折的交叉验证数据上进行平均,十折就是将训练样本分成十等分,十分之一作为测试集,十分之九作为训练集,一次进行训练测试,循环九次
train_scores_mean = np.mean(train_scores, axis=1)
val_scores_mean = np.mean(val_scores, axis=1)
# 绘制学习曲线
plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='training')
plt.plot(train_sizes, val_scores_mean, '*-', color='g', label='cross validation')
plt.xlabel('training sample size')
plt.ylabel('accuracy')
plt.legend(loc='best')
plt.show()
# gamma=0.1改变超参数
train_sizes, train_scores, val_scores = learning_curve(
SVC(gamma=0.1), X, y, cv=10, scoring='accuracy',
train_sizes=[0.1, 0.25, 0.5, 0.75, 1]
# 在10折的交叉验证数据上进行平均
train_scores_mean = np.mean(train_scores, axis=1)
val_scores_mean = np.mean(val_scores, axis=1)
# 绘制学习曲线
plt.plot(train_sizes, train_scores_mean, 'o-', color='r', label='training')
plt.plot(train_sizes, val_scores_mean, '*-', color='g', label='cross validation')
plt.xlabel('training sample size')
plt.ylabel('accuracy')
plt.legend(loc='best')
plt.show()
交叉验证及参数调整:
验证曲线(vzlidation curve):sklearn.model_selection.validation_curve 生成的图像横轴是不同的gamma值,纵轴是准确率,蓝色线是验证集 黄色线是在训练集上的曲线 gamma值取两条曲线趋势分开所对应的值
参数调整:
模型参数包括两种:1.模型自身参数,通过样本学习得到的参数。如:逻辑回归及神经网络中的权重及偏置的学习的等;2.超参数,模型框架的参数,如kmeans中的k,神经网络中的网络层数及每层的节点个数。通常由手工设定(设定几个参数就进行 几次循环)交叉验证得到。
如何调整参数:
1.交叉验证:sklearn.model_selection.cross_val_score
参考第八课中交叉验证讲解
2.网格搜索(Grid Search):横轴设定cv的数值表示运行多少折,纵轴设置gamma值,形成网格格式就行运算调整,得出最优
sklearn.model_selection.GridSearchCV
验证曲线:
from sklearn.model_selection import validation_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
# 加载数据
digits = load_digits()
X = digits.data
y = digits.target
print(X.shape)
#param_range = np.arange(1, 6) / 500.
param_range = np.logspace(-6.5, -2, 10)表示对数空间,gamma值在这个区间中取值
print(param_range)
train_scores, val_scores‘在验证集上得到的’ = validation_curve(
SVC(), X, y, param_name='gamma', param_range=param_range,
cv=5, scoring='accuracy')
在上文中指定的区间中取从第一个起到最后的gamma值进行5折的运算,选取最优gamma参数
# 在5折的交叉验证数据上进行平均
train_scores_mean = np.mean(train_scores, axis=1)
val_scores_mean = np.mean(val_scores, axis=1)
# 绘制学习曲线
plt.plot(param_range, train_scores_mean, 'o-', color='r', label='training')
plt.plot(param_range, val_scores_mean, '*-', color='g', label='cross validation')
plt.xlabel('gamma')
plt.ylabel('accuracy')
plt.legend(loc='best')
plt.show()
网格搜索(Grid Search)代码:
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets, svm
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)
# 设置参数调整的范围及配置
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},‘当线性拟合时选定c(验证参数)的范围’运行完得出四个值
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]‘gamma参数是针对高斯拟合(rdf)才会有’每个gamma值对应一个C值运算后得出八个值
一共得出十二种组合的值选择最好的参数组合
svm_model = svm.SVC()
# 将超参数配置及模型放入GridSearch中进行自动搜索
clf = GridSearchCV(svm_model, param_grid, cv=5)
clf.fit(X_train, y_train)
param_grid表示要搜寻的参数的空间 cv=5表示在每个参数空间的配置组合上做5折的运算选取最优
# 获取选择的最优模型
best_model = clf.best_estimator_
# 查看选择的最优超参数配置
print(clf.best_params_)
y_pred = best_model.predict(X_test)
print('accuracy', accuracy_score(y_test, y_pred))
特征选择:
sklearn中的特征选择方法:
1.去除方差小的特征,VarianceThreshold,方差是衡量两个向量间的差异性,极端情况,如果所有样本在某个维度上的特征全都相同,即0方差,说明该特征描述或代表样本的能力很弱;
2.基于单变量统计特征选择,根据单变量统计测试选取特征,SelectKBest;根据特征分布观察
3.基于模型的特征选择,如:随机森林等(决策树)把每一个特征指定到一个模型上对每个特征进行评分然后从高到低排序,选择所需要的特征
1.去除方差小的特征
from sklearn.feature_selection import VarianceThreshold
# 6个样本,3维的特征向量
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
# 根据方差保留80%的向量
# 计算公式:var_thresh = p(1-p)保留比例
sel (可以看成模型.)= VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
2. 基于单变量统计特征选择
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2表示卡方分布,通过卡方分布来拟合每一个特征的分布然后进行选择
iris = load_iris()
X, y = iris.data, iris.target
print('原始特征:')
print(X.shape)
print(X[:5, :])
# 使用卡方分布选择2个维度的变量
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
print('选取的特征:')
print(X_new.shape)
print(X_new[:5, :])
3. 基于模型的特征选择
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
print('原始特征:')
print(X.shape)
print(X[:5, :])‘选取一到五行,每一行的内容全部输出’
clf = RandomForestClassifier()随机森林分类
clf = clf.fit(X, y)训练模型
print('特征得分:')
print(clf.feature_importances_
# 基于随机森林选择特征
model = SelectFromModel(clf, prefit=True)特征选择模型,之前训练好的设置为TRUE,没有训练好的设置为False
X_new = model.transform(X)
print('选取的特征:')
print(X_new.shape)
print(X_new[:5, :])
原始特征:
特征得分:
选取的特征:
逻辑回归模型中超参数‘c’表示正则化项前面的系数,一般在机器学习里面都会加这样的系数,防止过拟合
评价指标补充:
当样本集不是平衡数据集时不能单单靠准确率来判断,通常来看每个类上的准确率
1.曲线下面积(Area Under Curve,AUC)
二分类模型的评价指标;
曲线:接收者操作特征曲线(receiver operatig characteristic curve,ROC曲线);
AUC的值就是ROC曲线下的面积,比较曲线下面积越大,模型越好。
真阳性(TP),预测值是1,真实值是1
伪阳性(FP),预测值是1,但真实值是0
真阴性(TN),预测值是0,真实值是0
伪阴性(FN),预测值是0,但真实值是1
TPR:在所有实际值是1的样本中,被正确地预测为1的比率(True positive rate)
TPR=TP/(TP+FN)
FPR:在所有实际值是0的样本中,被错误地预测为1的比率(False positive rate)
FPR=FP/(FP+TN)
ROC空间将FPR定义为x轴,TPR定义为y轴;
根据预测概率和设定的阈值将样本划到相应类别中,如:某样本被预测为0的概率是0.7,被预测为1的概率是0.3,如果设定阈值是0.2,样本被划分到1;如果设定阈值是0.4,该样本被划分到0 注意:当样本集比较平衡时,阈值可以选择0.5
选取0~1每个点为阈值,根据所划分的类别分别计算TPR和FPR,描述在ROC空间内,连接这些坐标点就得到了ROC曲线
AUC在0~1之间
0.5 & AUC &1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值
AUC=0.5,跟随机猜测一样(如:丢铜板),模型没有预测价值;相当于坐标轴的对角线
AUC &0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
详细讲解请参考:https://zh.wikipedia.org/wiki/ROC%E6%9B%B2%E7%BA%BF
2.对数损失(logloss):针对多分类 求出的值越小代表模型越好
对于每个样本来说,预测结果会将其归到某一类中;但有时模型的输出结果是一组概率,比如3分类问题,输出结果可能是[0.1,0.8,0.1],那么这个被预测为第二个类;
对于这类模型的输出可以用logloss来评价预测结果,公式如下:
将预测数据做log(对数运算),
其中,N是样本数量,M是类别个数,如果第i个样本属于第j个类,y(ij)为1,否则为0,P(ij)是第i个样本被预测为第j个类的概率
注:对数损失(logloss)模型中放入样本标签以及对应的分类的概率。
代码:sklearn.metrics.log_loss
混淆矩阵:可以可视化评价指标,评价结果,样本分类做预测然后查看每个类上的真实值和预测值的关系,一般是看对角线上的值,值越高代表预测率越高可以看出每个类里的效果
项目实战:通过移动设备行为数据预测性别年龄
项目介绍:通过行为习惯对移动用户人口属性(年龄+性别)进行预测
数据及包含~20万用户数据,分成12组,同时提供了用户行为属性,如:手机品牌、型号、APP的类型等
评价指标:logloss
步骤:1.解读数据;2.特征工程;3.模型调参
数据集结构;
数据集说明:每个用户用一个ID表示,一个用户的行为是在一系列的Events里面,每个Event里面的信息包括该ID行为发生的时间、地理坐标信息,安装的APP类型、手机型号类别等
涉及知识点:1.pandas多表连接,数据处理;2.OneHot编码;3.特征选择;4.交叉验证选择参数
OneHot编码:遇到类别特征需要转化为数值,如果用1、2、3、4...表示的话,数值之间有大小关系,用数值代表这些类别特征还不能有大小关系所以用到OneHot编码,用数值1表示在哪个类上‘激活’就是在那个位置上代表对应的类,有几个类编码长度就是对应的个数;
在skilearn中使用OneHot编码,第一步将特征类别用数值1,2,3,4...表示,代码:label_encoder;转化成数字之后在此基础上进行OneHot编码,代码: OneHot_encoder
# -*- coding: utf-8 -*-
项目名称:通过移动设备行为数据预测使用者的性别和年龄 (TalkingData Mobile User Demographics)
Kaggle地址:/c/talkingdata-mobile-user-demographics
import pandas as pd
from pd_tools import split_train_test, get_part_data
import numpy as np
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn import svm
from sklearn.decomposition import PCA
from ml_tools import get_best_model
from sklearn.metrics import log_loss
from sklearn.feature_selection import VarianceThreshold
# 数据集变量声明
dataset_path = './dataset'
gender_age_filename = 'gender_age.csv'
phone_brand_device_model_filename = 'phone_brand_device_model.csv'
events_filename = 'events.csv'
app_events_filename = 'app_events.csv'
app_labels_filename = 'app_labels.csv'
label_categories_filename = 'label_categories.csv'
train_gender_age_filename = 'gender_age_train.csv'
test_gender_age_filename = 'gender_age_test.csv'
is_first_run = False
def run_main():
if is_first_run:
# 1. 分割数据集
print('分割数据集')
all_gender_age = pd.read_csv(os.path.join(dataset_path, gender_age_filename))
df_train, df_test = split_train_test(all_gender_age)
# 查看训练集测试集基本信息
print('训练集中各类的数据个数:', df_train.groupby('group').size())
print('测试集中各类的数据个数:', df_test.groupby('group').size())
# 保存分割的数据集
df_train.to_csv(os.path.join(dataset_path, train_gender_age_filename),
index=False)
df_test.to_csv(os.path.join(dataset_path, test_gender_age_filename),
index=False)
# 2. 加载数据
print('加载数据')
# 加载数据
gender_age_train = pd.read_csv(os.path.join(dataset_path, train_gender_age_filename),
index_col='device_id')
gender_age_test = pd.read_csv(os.path.join(dataset_path, test_gender_age_filename),
index_col='device_id')
在这里指定索引将'device_id'指定为行索引
# 选取部分数据用于实验
percent = 0.1 只选取百分之十的数据量
gender_age_train = get_part_data(gender_age_train, percent=percent)
gender_age_test = get_part_data(gender_age_test, percent=percent)
phone_brand_device_model = pd.read_csv(os.path.join(dataset_path, phone_brand_device_model_filename))
# 去掉重复数据
phone_brand_device_model = phone_brand_device_model.drop_duplicates('device_id').set_index('device_id')
events = pd.read_csv(os.path.join(dataset_path, events_filename),
usecols=['device_id', 'event_id'], index_col='event_id')
app_events = pd.read_csv(os.path.join(dataset_path, app_events_filename),
usecols=['event_id', 'app_id'])
# app_labels = pd.read_csv(os.path.join(dataset_path, app_labels_filename))
# 3. 特征工程
# 3.1 手机品牌特征
# 使用LabelEncoder将类别转换为数字
brand_label_encoder = LabelEncoder()
brand_label_encoder.fit(phone_brand_device_model['phone_brand'].values)#fit就是 在训练集上做训练或者拟合,本例中就是在训练集中统计有几个类,tranfrom就是在训练好的数据上做转换,就是将之前统计好的几个类转换成数值1、2、3...
phone_brand_device_model['brand_label_code']= \ brand_label_encoder.transform(phone_brand_device_model['phone_brand'].values)
gender_age_train['brand_label_code'] = phone_brand_device_model['brand_label_code']
gender_age_test['brand_label_code'] = phone_brand_device_model['brand_label_code']
在进行表连接时,直接将所需要连接的两个表中相同的标签进行赋值到另一张表中,上文中是将'brand_label_code'赋值到另一张表中,pandas在处理数据时是带着索引值进行处理的,利用索引指定添加到另一张表中,在这里赋值时就会将相同行索引进行赋值
# 使用OneHotEncoder将数字转换为OneHot码
brand_onehot_encoder = OneHotEncoder()
brand_onehot_encoder.fit(phone_brand_device_model['brand_label_code'].values.reshape(-1, 1))
tr_brand_feat = brand_onehot_encoder.transform(gender_age_train['brand_label_code'].values.reshape(-1, 1))
te_brand_feat = brand_onehot_encoder.transform(gender_age_test['brand_label_code'].values.reshape(-1, 1))
print('[手机品牌]特征维度:', tr_brand_feat.shape[1])
# 3.2 手机型号特征
# 合并手机品牌与型号字符串
phone_brand_device_model['brand_model'] = \
phone_brand_device_model['phone_brand'].str.cat(phone_brand_device_model['device_model'])
# 使用LabelEncoder将类别转换为数字
model_label_encoder = LabelEncoder()
model_label_encoder.fit(phone_brand_device_model['brand_model'].values)
phone_brand_device_model['brand_model_label_code'] = \
model_label_encoder.transform(phone_brand_device_model['brand_model'].values)
gender_age_train['brand_model_label_code'] = phone_brand_device_model['brand_model_label_code']
gender_age_test['brand_model_label_code'] = phone_brand_device_model['brand_model_label_code']
# 使用OneHotEncoder将数字转换为OneHot码
model_onehot_encoder = OneHotEncoder()
model_onehot_encoder.fit(phone_brand_device_model['brand_model_label_code'].values.reshape(-1, 1))
tr_model_feat = model_onehot_encoder.transform(gender_age_train['brand_model_label_code'].values.reshape(-1, 1))
te_model_feat = model_onehot_encoder.transform(gender_age_test['brand_model_label_code'].values.reshape(-1, 1))
print('[手机型号]特征维度:', tr_model_feat.shape[1])
# 3.3 安装app特征
device_app = app_events.merge(events, how='left', left_on='event_id', right_index=True)
# 运行app的总次数
n_run_s = device_app['app_id'].groupby(device_app['device_id']).size()
# 运行app的个数
n_app_s = device_app['app_id'].groupby(device_app['device_id']).nunique()
gender_age_train['n_run'] = n_run_s
gender_age_train['n_app'] = n_app_s
nunique()表示不管重复几次或者只有一次,只是选取一次
# 填充缺失数据
gender_age_train['n_run'].fillna(0, inplace=True)
gender_age_train['n_app'].fillna(0, inplace=True)
gender_age_test['n_run'] = n_run_s
gender_age_test['n_app'] = n_app_s
# 填充缺失数据
gender_age_test['n_run'].fillna(0, inplace=True)
gender_age_test['n_app'].fillna(0, inplace=True)
tr_run_feat = gender_age_train['n_run'].values.reshape(-1, 1)
tr_app_feat = gender_age_train['n_app'].values.reshape(-1, 1)
te_run_feat = gender_age_test['n_run'].values.reshape(-1, 1)
te_app_feat = gender_age_test['n_app'].values.reshape(-1, 1)
# 3.4 合并所有特征
tr_feat = np.hstack((tr_brand_feat.toarray(), tr_model_feat.toarray(), tr_run_feat, tr_app_feat))
te_feat = np.hstack((te_brand_feat.toarray(), te_model_feat.toarray(), te_run_feat, te_app_feat))
print('特征提取结束')
print('每个样本特征维度:', tr_feat.shape[1])
# 3.5 特征范围归一化
scaler = StandardScaler()
tr_feat_scaled = scaler.fit_transform(tr_feat)
te_feat_scaled = scaler.transform(te_feat)
# 3.6 特征选择
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))表示选择百分之八十进行特征选择
tr_feat_scaled_sel = sel.fit_transform(tr_feat_scaled)
te_feat_scaled_sel = sel.transform(te_feat_scaled)
# 3.7 PCA降维操作
pca = PCA(n_components=0.95)
# 保留95%共献率的特征向量
tr_feat_scaled_sel_pca = pca.fit_transform(tr_feat_scaled_sel)
te_feat_scaled_sel_pca = pca.transform(te_feat_scaled_sel)
print('特征处理结束')
print('处理后每个样本特征维度:', tr_feat_scaled_sel_pca.shape[1])
在训练集上可以做fit、transform;但是只能在测试集上做transfrom 假设测试数据是不知道的,测试数据的PCA是通过训练数据得到的
# 4 为数据添加标签
group_label_encoder = LabelEncoder()可以用来处理标签下的数据,将字符串转换成数值方便计算机运算
group_label_encoder.fit(gender_age_train['group'].values)
y_train = group_label_encoder.transform(gender_age_train['group'].values)
y_test = group_label_encoder.transform(gender_age_test['group'].values)
# 5. 训练模型
# 5.1 逻辑回归模型
print('训练逻辑回归模型...')
lr_param_grid = [
{'C': [1e-3, 1e-2, 1e-1, 1, 10, 100]}指定超参数,带入模型进行运算选取最好
lr_model = LogisticRegression()
best_lr_model = get_best_model(lr_model,初始化模型放入所需要的特征
tr_feat_scaled_sel_pca, y_train,
lr_param_grid, cv=3)
y_pred_lr = best_lr_model.predict_proba(te_feat_scaled_sel_pca)返回回来输出的标签,如果这样只是调用‘predict’那么就是默认哪个最大就是返回哪个类,如果调用‘predict_proba’那么就是有多少类就是返回多少概率
print('训练SVM模型...')
svm_param_grid = [
{'C': [1e-2, 1e-1, 1, 10, 100], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
# 设置probability=True用于输出预测概率 SVM是默认不能输出概率值的,只能输出标签值,需要指定
svm_model = svm.SVC(probability=True)
best_svm_model = get_best_model(svm_model,
tr_feat_scaled_sel_pca, y_train,
svm_param_grid, cv=3)
y_pred_svm = best_svm_model.predict_proba(te_feat_scaled_sel_pca)
注意:如果probability=False时,那么这里就不能用predict_proba方法
# 6. 查看结果
print('逻辑回归模型 logloss:', log_loss(y_test, y_pred_lr))
print('SVM logloss:', log_loss(y_test, y_pred_svm))
注意:logloss的范围是大于0,没有上界,越小越好,越接近0越好
if __name__ == '__main__':
run_main()
资深算法工程师查尔斯特大学(Charles Sturt University)计算机博士,从事机器学习、计算机视觉及模式识别等相...特征选择(Feature Selection):choosing a subset of all the features(the ones more informative)。最终得到的特征选是原来特征的一个子集。
特征选取是机器学习领域非常重要的一个方向。
主要有两个功能:
(1)减少特征数量、降维,使模型泛化能力更强,减少过拟合
(2)增强特征和特征值之间的理解
1, 去掉取值变化小的特征(Removing features with low variance)
这应该是最简单的特征选择方法了:假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用,而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
sklearn.feature_selection.VarianceThreshold(threshold=0.0)
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
#array([[0, 1],
第一列的特征被去掉
2, 单变量特征选择(Univariate feature selection)
基于单变量统计测试。
单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。对于回归和分类问题可以采用卡方检验等方式对特征进行测试。
方法简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效);这种方法有许多改进的版本、变种。
因此建议作为特征选择的前处理中的一步。
sklearn.feature_selection.SelectKBest(score_func=&function f_classif&, k=10)
选择前k个分数较高的特征,去掉其他的特征。
sklearn.feature_selection.SelectPercentile(score_func=&function f_classif&, percentile=10)
f_regression(单因素线性回归试验)用作回归
chi2卡方检验,f_classif(方差分析的F值)等用作分类
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target
#(150, 4)
X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
X_new.shape
#(150, 2)
选择一定百分比的最高的评分的特征。
sklearn.feature_selection.SelectFpr(score_func=&function f_classif&, alpha=0.05)
根据配置的参选搜索
sklearn.feature_selection.GenericUnivariateSelect(score_func=&function f_classif&, mode='percentile', param=1e-05
3,递归特征消除Recursive feature elimination (RFE)
递归特征消除的主要思想是反复的构建模型(如SVM或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征选择出来,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
RFE的稳定性很大程度上取决于在迭代的时候底层用哪种模型。例如,假如RFE采用的普通的回归,没有经过正则化的回归是不稳定的,那么RFE就是不稳定的;假如采用的是Ridge,而用Ridge正则化的回归是稳定的,那么RFE就是稳定的。
class sklearn.feature_selection.RFECV(estimator, step=1, cv=None, scoring=None, estimator_params=None, verbose=0)
from sklearn.svm import SVC
from sklearn.datasets import load_digits
from sklearn.feature_selection import RFE
import matplotlib.pyplot as plt
# Load the digits dataset
digits = load_digits()
X = digits.images.reshape((len(digits.images), -1))
y = digits.target
# Create the RFE object and rank each pixel
svc = SVC(kernel="linear", C=1)
rfe = RFE(estimator=svc, n_features_to_select=1, step=1)
rfe.fit(X, y)
ranking = rfe.ranking_.reshape(digits.images[0].shape)
# Plot pixel ranking
plt.matshow(ranking)
plt.colorbar()
plt.title("Ranking of pixels with RFE")
plt.show()
4, Feature selection using SelectFromModel
SelectFromModel 是一个 meta-transformer,可以和在训练完后有一个coef_ 或者 feature_importances_ 属性的评估器(机器学习算法)一起使用。
如果相应的coef_ 或者feature_importances_ 的值小于设置的阀值参数,这些特征可以视为不重要或者删除。除了指定阀值参数外,也可以通过设置一个字符串参数,使用内置的启发式搜索找到夜歌阀值。可以使用的字符串参数包括:“mean”, “median” 以及这两的浮点乘积,例如“0.1*mean”.
sklearn.feature_selection.SelectFromModel(estimator, threshold=None, prefit=False)
与Lasso一起使用,从boston数据集中选择最好的两组特征值。
import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LassoCV
boston = load_boston()
X, y = boston['data'], boston['target']
clf = LassoCV()
sfm = SelectFromModel(clf, threshold=0.25)
sfm.fit(X, y)
n_features = sfm.transform(X).shape[1]
while n_features & 2:
sfm.threshold += 0.1
X_transform = sfm.transform(X)
n_features = X_transform.shape[1]
plt.title(
"Features selected from Boston using SelectFromModel with "
"threshold %0.3f." % sfm.threshold)
feature1 = X_transform[:, 0]
feature2 = X_transform[:, 1]
plt.plot(feature1, feature2, 'r.')
plt.xlabel("Feature number 1")
plt.ylabel("Feature number 2")
plt.ylim([np.min(feature2), np.max(feature2)])
plt.show()
4.1,L1-based feature selection
L1正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成0。因此L1正则化往往会使学到的模型很稀疏(系数w经常为0),这个特性使得L1正则化成为一种很好的特征选择方法。
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
#(150, 4)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
X_new = model.transform(X)
X_new.shape
#(150, 3)
4.2, 随机稀疏模型Randomized sparse models
面临一些相互关联的特征是基于L1的稀疏模型的限制,因为模型只选择其中一个特征。为了减少这个问题,可以使用随机特征选择方法,通过打乱设计的矩阵或者子采样的数据并,多次重新估算稀疏模型,并且统计有多少次一个特定的回归量是被选中。
RandomizedLasso使用Lasso实现回归设置
sklearn.linear_model.RandomizedLasso(alpha='aic', scaling=0.5, sample_fraction=0.75, n_resampling=200, selection_threshold=0.25, fit_intercept=True, verbose=False, normalize=True, precompute='auto', max_iter=500, eps=2.3131e-16, random_state=None, n_jobs=1, pre_dispatch='3*n_jobs', memory=Memory(cachedir=None))
RandomizedLogisticRegression 使用逻辑回归 logistic regression,适合分类任务
sklearn.linear_model.RandomizedLogisticRegression(C=1, scaling=0.5, sample_fraction=0.75, n_resampling=200, selection_threshold=0.25, tol=0.001, fit_intercept=True, verbose=False, normalize=True, random_state=None, n_jobs=1, pre_dispatch='3*n_jobs', memory=Memory(cachedir=None))
基于树的特征选择Tree-based feature selection
基于树的评估器 (查看sklearn.tree 模块以及在sklearn.ensemble模块中的树的森林) 可以被用来计算特征的重要性,根据特征的重要性去掉无关紧要的特征 (当配合sklearn.feature_selection.SelectFromModel meta-transformer):
from sklearn.ensemble import ExtraTreesClassifier
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X, y = iris.data, iris.target
#(150, 4)
clf = ExtraTreesClassifier()
clf = clf.fit(X, y)
clf.feature_importances_
array([ 0.04...,
model = SelectFromModel(clf, prefit=True)
X_new = model.transform(X)
X_new.shape
#(150, 2)
Feature selection as part of a pipeline
在进行学习之前,特征选择通常被用作预处理步骤。在scikit-learn中推荐使用的处理的方法是sklearn.pipeline.Pipeline
sklearn.pipeline.Pipeline(steps)
Pipeline of transforms with a final estimator.
Sequentially 应用一个包含 transforms and a final estimator的列表 ,pipeline中间的步骤必须是‘transforms’, 也就是它们必须完成fit 以及transform 方法s. final estimator 仅仅只需要完成 fit方法.
使用pipeline是未来组合多个可以在设置不同参数时进行一起交叉验证的步骤 。因此,它允许设置不同步骤中的参数事使用参数名,这些参数名使用‘__’进行分隔。如下实例中所示:
from sklearn import svm
from sklearn.datasets import samples_generator
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import f_regression
from sklearn.pipeline import Pipeline
X, y = samples_generator.make_classification(
n_informative=5, n_redundant=0, random_state=42)
anova_filter = SelectKBest(f_regression, k=5)
clf = svm.SVC(kernel='linear')
anova_svm = Pipeline([('anova', anova_filter), ('svc', clf)])
anova_svm.set_params(anova__k=10, svc__C=.1).fit(X, y)
Pipeline(steps=[...])
prediction = anova_svm.predict(X)
anova_svm.score(X, y)
anova_svm.named_steps['anova'].get_support()
#array([ True,
True, False, False,
True, False,
True, True,
False, False,
True, False,
True, False, False, False, False,
True], dtype=bool)
简单语法示例:
clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
clf.fit(X, y)
常用特征选取算法
Feature selection
注:以后继续补充
本文已收录于以下专栏:
相关文章推荐
phython中实现特征选择的三种方法:
过滤型:选择与目标变量相关性较强的特征。缺点:忽略了特征之间的关联性。
包裹型:基于线性模型相关系数以及模型结果AUC逐步剔除特征。如果剔除相关系数绝对值较小...
函数:pearsonr(x,y)功能:
计算特征与目标变量之间的相关度
参数说明:
1)输入:x为特征,y为目标变量.
2)输出:r: 相关系数 [-1,1]之间,p-value:...
&&& from sklearn.datasets import load_iris
&&& from sklearn.feature_selection import SelectKBe...
系统自己的系统是
Mac OSX EI Capitan
python版本是 python3.5 64bit在Graphviz 官网查看到的mac os 的版本比较旧,没找到当前系统的版本。据其介绍...
我们先带着大家过一遍传统机器学习算法,基本思想和用途。把问题解决思路和方法应用建议提前到这里的想法也很简单,希望能提前给大家一些小建议,对于某些容易出错的地方也先给大家打个预防针,这样在理解后续相应机...
机器学习之分类器性能指标之ROC曲线、AUC值
/dlml/p/4403482.html
分类器性能指标之ROC曲线、AUC值
一 r...
创新工场、今日头条、搜狗联合主办“AI Challenger ?全球AI挑战赛”携总值超200万元奖金池、千万量级高质量开放数据集与宝贵GPU资源8月14日面向全球诚挚发布,邀您共同参与。更多精彩尽在...
斯坦福机器学习实现与分析之二(线性回归)
/jcchen1987/p/4401533.html
回归问题提出
  首先需要明确回归问题...
0-150mm  游标卡尺  吴祖丽 欢迎来电!上门看货!价格好商量!你的满意是我们的追求!旺和电子联系人:吴祖丽    QQ:
f作者: 寒小阳 &&龙心尘
时间:2015年10月。
声明:版权所有,转载请注明出处,谢谢。手把手机器学习之逻辑回归应用——Kaggle泰坦尼克之灾1.引言先说一句,年末双十一什么的一...
他的最新文章
讲师:AI100
讲师:谢梁
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 variancethreshold 的文章

 

随机推荐