4-3 嵌入法

2023-11-06

4.3 嵌入法

请参考《数据准备和特征工程》中的相关章节,调试如下代码。


基础知识

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression

# 划分训练集和测试集
df_wine = pd.read_csv("data/data20527/wine_data.csv")
X, y = df_wine.iloc[:, 1:], df_wine.iloc[:, 0].values
X_train, X_test, y_train, y_test = train_test_split(
        X, y, test_size=0.3, 
        random_state=0, 
        stratify=y)

# 特征标准化变换
std = StandardScaler()
X_train_std = std.fit_transform(X_train)
X_test_std = std.fit_transform(X_test)

# 创建对数概率回归模型lr,采取L1惩罚——这是实现嵌入法的关键
lr = LogisticRegression(C=1.0, penalty='l1',solver='liblinear')    

# 创建特征选择实例,并规定选择特征的阈值threshold:特征权重的中位数median。
model = SelectFromModel(lr, threshold='median')    
X_new = model.fit_transform(X_train_std, y_train)
X_new.shape
(124, 7)
X_train_std.shape
(124, 13)

项目案例

data = pd.read_csv("data/data20533/diabetes.csv")
print(data.shape)

print(data.columns)
(768, 9)
Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],
      dtype='object')
# !mkdir /home/aistudio/external-libraries
# !pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost -t /home/aistudio/external-libraries
import sys
sys.path.append('/home/aistudio/external-libraries')
X = data.loc[:, :"Age"]
y = data.loc[:, "Outcome":]

# 创建数据模型并训练,xgboost:分布式梯度增强库
from xgboost import XGBClassifier
model = XGBClassifier(eval_metric='mlogloss')   
model.fit(X,y)

# 训练之后,得到各个特征的重要度,以便进行特征选择
model.feature_importances_
array([0.10621197, 0.2424023 , 0.08803366, 0.07818192, 0.10381887,
       0.1486732 , 0.10059207, 0.13208601], dtype=float32)
%matplotlib inline
from xgboost import plot_importance

plot_importance(model)

png

selection = SelectFromModel(model, threshold='median', prefit=True)   
 
X_new = selection.transform(X)
X_new.shape, X.shape
((768, 4), (768, 8))
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 构建分类模型model,并进行训练,用测试集通过模型来得到预测结果
model = XGBClassifier(eval_metric='mlogloss')
model.fit(X_train, y_train.values.reshape(1, -1)[0])
y_pred = model.predict(X_test)

# 计算真实的准确率:accuracy
accuracy = accuracy_score(y_test, y_pred)
print("准确率: {0:.2f}%".format(accuracy * 100))

# 将排序好的重要度作为阈值,来对模型进行特征选择:SelectFromModel
thresholds = np.sort(model.feature_importances_)
for threshold in thresholds:
    selection = SelectFromModel(model, threshold=threshold, prefit=True)
    X_train_new = selection.transform(X_train)
    X_test_new = selection.transform(X_test)
    
    # 构建特征选择模型:selection_model
    selection_model = XGBClassifier(eval_metric='mlogloss')
    selection_model.fit(X_train_new, y_train.values.reshape(1, -1)[0])
    y_pred = selection_model.predict(X_test_new)

    accuracy = accuracy_score(y_test, y_pred)
    print("阈值={0:.2f}, 特征数量={1}, 准确率: {2:.2f}%".format(threshold, X_train_new.shape[1], accuracy*100))
准确率: 75.32%

阈值=0.07, 特征数量=8, 准确率: 75.32%

阈值=0.08, 特征数量=7, 准确率: 75.76%

阈值=0.09, 特征数量=6, 准确率: 74.46%

阈值=0.10, 特征数量=5, 准确率: 74.46%

阈值=0.10, 特征数量=4, 准确率: 76.19%

阈值=0.15, 特征数量=3, 准确率: 75.76%

阈值=0.16, 特征数量=2, 准确率: 74.89%

阈值=0.27, 特征数量=1, 准确率: 71.86%

动手练习

df = pd.read_csv("data/data20533/app_small.csv")   

df.drop('Unnamed: 0', axis=1, inplace=True)

print(df.shape)
print(df.columns)
(30751, 122)
Index(['SK_ID_CURR', 'TARGET', 'NAME_CONTRACT_TYPE', 'CODE_GENDER',
       'FLAG_OWN_CAR', 'FLAG_OWN_REALTY', 'CNT_CHILDREN', 'AMT_INCOME_TOTAL',
       'AMT_CREDIT', 'AMT_ANNUITY',
       ...
       'FLAG_DOCUMENT_18', 'FLAG_DOCUMENT_19', 'FLAG_DOCUMENT_20',
       'FLAG_DOCUMENT_21', 'AMT_REQ_CREDIT_BUREAU_HOUR',
       'AMT_REQ_CREDIT_BUREAU_DAY', 'AMT_REQ_CREDIT_BUREAU_WEEK',
       'AMT_REQ_CREDIT_BUREAU_MON', 'AMT_REQ_CREDIT_BUREAU_QRT',
       'AMT_REQ_CREDIT_BUREAU_YEAR'],
      dtype='object', length=122)
# 数字类型的特征和非数字类型的特征分别保存到不同的列表中
categorical_list = []
numerical_list = []

for i in df.columns.tolist():
    if df[i].dtype=='object':
        categorical_list.append(i)
    else:
        numerical_list.append(i)

print('分类特征的数量:', str(len(categorical_list)))
print('数值特征数量:', str(len(numerical_list)))
分类特征的数量: 16
数值特征数量: 106
# 检查numerical_list中的特征是否有缺失值
df[numerical_list].isna().any()
SK_ID_CURR                    False
TARGET                        False
CNT_CHILDREN                  False
AMT_INCOME_TOTAL              False
AMT_CREDIT                    False
                              ...  
AMT_REQ_CREDIT_BUREAU_DAY      True
AMT_REQ_CREDIT_BUREAU_WEEK     True
AMT_REQ_CREDIT_BUREAU_MON      True
AMT_REQ_CREDIT_BUREAU_QRT      True
AMT_REQ_CREDIT_BUREAU_YEAR     True
Length: 106, dtype: bool
# 用每个特征的中位数填补本特征中的缺失数据
from sklearn.impute import SimpleImputer

df[numerical_list] = SimpleImputer(strategy='median').fit_transform(df[numerical_list])
# categorical_list中的特征都是分类型特征,于是乎进行OneHot编码(创建虚拟变量)
df = pd.get_dummies(df, drop_first=True)
print(df.shape)

X = df.drop(['SK_ID_CURR', 'TARGET'], axis=1)
y = df['TARGET']

feature_name = X.columns.tolist()
(30751, 228)
# 先对X进行特征规范化操作,而后利用卡方检验选择100个特征
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler

X_norm = MinMaxScaler().fit_transform(X)    # MinMax区间化
chi_selector = SelectKBest(chi2, k=100)    # 过滤器法:chi2卡方检验
chi_selector.fit(X_norm, y)

chi_support = chi_selector.get_support()
chi_feature = X.loc[:,chi_support].columns.tolist()   
print(len(chi_feature))
100
# 使用封装器,选100个特征
from sklearn.feature_selection import RFE    
from sklearn.linear_model import LogisticRegression

# Logistic回归作为目标函数
rfe_selector = RFE(estimator=LogisticRegression(), n_features_to_select=100, step=10, verbose=5)   
rfe_selector.fit(X_norm, y)  

rfe_support = rfe_selector.get_support()
rfe_feature = X.loc[:,rfe_support].columns.tolist()
print(len(rfe_feature))
Fitting estimator with 226 features.

Fitting estimator with 216 features.

Fitting estimator with 206 features.

Fitting estimator with 196 features.

Fitting estimator with 186 features.

Fitting estimator with 176 features.

Fitting estimator with 166 features.

Fitting estimator with 156 features.

Fitting estimator with 146 features.

Fitting estimator with 136 features.

Fitting estimator with 126 features.

Fitting estimator with 116 features.

Fitting estimator with 106 features.
# Logistic回归模型
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression    #使用logistic回归模型

embeded_lr_selector = SelectFromModel(
    LogisticRegression(penalty="l1",solver='liblinear'), 
    '1.25*median')
embeded_lr_selector.fit(X_norm, y)

embeded_lr_support = embeded_lr_selector.get_support()
embeded_lr_feature = X.loc[:,embeded_lr_support].columns.tolist()
print(str(len(embeded_lr_feature)), '选择的特征')
103 选择的特征
# 改为随机森林分类
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier  #相对上面,模型换了

embeded_rf_selector = SelectFromModel(
    RandomForestClassifier(n_estimators=100),
    threshold='1.25*median')
embeded_rf_selector.fit(X, y)

embeded_rf_support = embeded_rf_selector.get_support()
embeded_rf_feature = X.loc[:,embeded_rf_support].columns.tolist()
print(str(len(embeded_rf_feature)), '选择的特征')
100 选择的特征
# 下把特征按照被选择的次数从高到低列出来
feature_selection_df = pd.DataFrame({'Feature':feature_name, 
                                     'Chi-2':chi_support, 
                                     'RFE':rfe_support, 
                                     'Logistics':embeded_lr_support,
                                     'Random Forest':embeded_rf_support})

# 每个特征在不同方式中被选择的次数总和
feature_selection_df['Total'] = np.sum(feature_selection_df, axis=1)

# 按照次数大小,显示前100个
feature_selection_df = feature_selection_df.sort_values(['Total','Feature'] , ascending=False)
feature_selection_df.index = range(1, len(feature_selection_df)+1)
feature_selection_df.head(100)
Feature Chi-2 RFE Logistics Random Forest Total
1 REGION_RATING_CLIENT_W_CITY True True True True 4
2 ORGANIZATION_TYPE_Self-employed True True True True 4
3 ORGANIZATION_TYPE_Construction True True True True 4
4 ORGANIZATION_TYPE_Business Entity Type 3 True True True True 4
5 NAME_EDUCATION_TYPE_Higher education True True True True 4
... ... ... ... ... ... ...
96 NAME_TYPE_SUITE_Family True False False True 2
97 NAME_INCOME_TYPE_Working True False False True 2
98 NAME_INCOME_TYPE_Pensioner True True False False 2
99 NAME_INCOME_TYPE_Maternity leave True True False False 2
100 NAME_HOUSING_TYPE_With parents True False False True 2

100 rows × 6 columns

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

4-3 嵌入法 的相关文章

随机推荐

  • c++链表实现多项式相加

    文章目录 链表实现多项式相加 数据结构 结构体定义 链表 多项式 初始化 Insert 插入单个节点 多项式的某一项 input 输入 sum 求和函数 print 输出函数 测试代码 测试结果 链表实现多项式相加 例如 已知多项式 L 1
  • 良心分享:基于Java+SpringBoot+Netty+WebSocket+Uniapp轻松搭建准实时聊天问答程序

    一步一步教你搭建准实时聊天问答程序 微信小程序 H5网页 本文将详细介绍如何基于你自己的开源项目搭建一个准实时聊天问答程序 包括微信小程序和H5网页版 该项目服务端主要使用了Java Spring Boot Netty WebSocket等
  • 傻瓜式鸿蒙3.0使用Google(无需电脑)

    首先声明 此文仅做交流学术及为出国用户提供微不足道的帮助用 请遵守我国相关法律法规 此文仅做交流学术及为出国用户提供微不足道的帮助用 请遵守我国相关法律法规 此文仅做交流学术及为出国用户提供微不足道的帮助用 请遵守我国相关法律法规 可以先给
  • jsp+mysql分页技巧:巧用limit 进行分页查询

    发现问题 今天检查web程序 浏览 彩信xxxx日志 时 突然发现该web程序中不能浏览了 出错了 如下 500 Servlet Exception java lang OutOfMemoryError Resin 3 0 6 built
  • 文件描述符的阻塞与非阻塞设置

    默认文件描述符是阻塞的 即文件IO是阻塞的 设置为非阻塞 int setNonBlock int fd int flags fcntl fd F GETFL if flags 1 return flags flags O NONBLOCK
  • Qt递归获取指定文件夹下的所有文件

    方法一 使用类QDirIterator来进行遍历 简介 大概是说 适合于大目录遍历 支持递归但是不支持排序 QDirIterator NoIteratorFlags默认值 没有标志 迭代器将返回path符合QDir Filters的条目 Q
  • Android图形显示系统6 图像缓冲区(下)

    一 概述 我们再次回顾下上一篇文章 Android图形显示系统5 图像缓冲区 上 描述的图像缓冲区 Android 图形缓冲区由哪些部分组成 Android 的图形缓冲区由 Surface BufferQueue Layer Graphic
  • 树14--二叉搜索树的第k个结点

    树14 二叉搜索树的第k个结点 jz62 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 给定一棵二叉搜索树 请找出其中的第k小的TreeNode结点 测试用例 输入 5 3 7 2 4 6 8 3 返回值 4 说明 按节点数
  • JSP 页面传值方法总结

    1 URL 链接后追加参数 a href next jsp paramA A paramB B URL 后面追加参数 a
  • 【华为面试题】空间换时间

    题目 代码 function findCenterIndex nums 当数组只有一个元素时 该元素即为中心位置 if nums length 1 return 0 初始化左侧乘积和右侧乘积 let leftProduct 1 let to
  • Unity笔记—7(Unity常用API整理之Transform组件)

    Unity笔记 7 Unity常用API整理之Transform组件 文章目录 Unity笔记 7 Unity常用API整理之Transform组件 前言 一 Transform类 位置转换 核心知识点 属性 方法 继承的方法和属性 来自C
  • 各类配置文件格式简介(ini,yaml,conf,xml...)和nb的Viper

    目录 配置文件 ini 介绍 语法 demo 库 json 语法 demo 库 xml 介绍 语法 demo yaml demo toml properties HOCON plist plist 是捆上了手脚的 xml Viper 22k
  • ES的DSL语句

    1 相关概念 mysql与elasticsearch的概念对比 MySQL Elasticsearch 说明 Table Index 索引 index 就是文档的集合 类似数据库的表 table Row Document 文档 Docume
  • vue 代理服务,解决跨域问题

    1 解决跨域访问失败 在项目的根目录下创建一个 vue config js 文件 创建配置文件 module exports devServer proxy api target http cdn apc 360 cn ws true pa
  • java中^怎么用_^运算符在Java中做什么?

    插入符号 运算符在Java中具有什么功能 当我尝试这个 int a 5 n 它给我 for n 5 returns 0 for n 4 returns 1 for n 6 returns 3 所以我猜它不执行幂运算 但是那是什么呢 您可以张
  • 2023-9-12 完全背包问题

    题目链接 完全背包问题 初版 时间复杂度拉满 include
  • 第四章 随机变量的数据特征 4.3协方差及相关系数

    第四章 随机变量的数据特征 4 3协方差及相关系数 文章目录 第四章 随机变量的数据特征 4 3协方差及相关系数 协方差和相关系数的概念和性质 相关系数的意义 协方差和相关系数的概念和性质 其在一定程度上反应了X 与 Y之间的关系 按照定义
  • 如何更高效的提高CSDN浏览量 - 提升博客的曝光度

    前言 CSDN作为中国最大的IT技术社区 对于技术人员而言 拥有高浏览量的博客是提升个人知名度和影响力的关键 本文将介绍一个名为 CSDN Browsing Plus 的工具 通过它 我们可以更高级地增长CSDN的浏览量 提升博客的曝光度
  • 获取文件的绝对路径

    想要访问执行程序 exe 路径下的文件 有以下几个步骤 1 先通过函数GetModuleFileName获取执行程序的绝对路径 TCHAR szPath MAX PATH 0 GetModuleFileName NULL szPath MA
  • 4-3 嵌入法

    文章目录 4 3 嵌入法 基础知识 项目案例 动手练习 4 3 嵌入法 请参考 数据准备和特征工程 中的相关章节 调试如下代码 基础知识 import pandas as pd from sklearn model selection im