目录

特征选择

过滤法(Filter Methods)

方差选择法

相关系数法

卡方检验

包裹法(Wrapper Methods)

递归特征消除(RFE)

嵌入法(Embedded Methods)

L1正则化(Lasso回归)

基于树模型的特征重要性

特征降维

主成分分析(PCA)

线性判别分析(LDA)

自动特征生成

使用Featuretools生成特征

特征交互

多项式特征

手动组合特征

特征编码

独热编码(One-Hot Encoding)

标签编码(Label Encoding)

基于频率或目标的编码(Frequency/Target Encoding)

基于频率的编码(Frequency Encoding)

基于目标的编码(Target Encoding)

基于目标的编码(平滑处理)

时间特征提取

文本特征提取

词袋模型(Bag of Words)

TF-IDF


特征选择

特征选择是减少特征数量、提高模型性能的关键步骤,常见的方法包括过滤法、包裹法和嵌入法

过滤法(Filter Methods)

过滤法通过统计指标来筛选特征,独立于模型

  • 方差选择法

选择方差大于阈值的特征

## 特征选择
# 过滤法(Filter Methods)
# 1. 方差选择法
import numpy as np
from sklearn.feature_selection import VarianceThresholddata = np.array([[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]])
selector = VarianceThreshold(threshold=0.5)
selected_data = selector.fit_transform(data)
print(selected_data)
# [[0]
#  [4]
#  [1]]
  • 相关系数法

选择与目标变量相关性高的特征

# 2. 相关系数法
import numpy as np
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonrX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])# 定义score_func,计算每个特征与目标变量y的皮尔逊相关系数
def pearsonr_score(X, y):scores = []for feature in X.T:  # 遍历每个特征corr, _ = pearsonr(feature, y)  # 计算皮尔逊相关系数scores.append(abs(corr))  # 取绝对值作为评分return np.array(scores)# 使用SelectKBest选择相关性最高的2个特征
selector = SelectKBest(score_func=pearsonr_score, k=2)
selected_data = selector.fit_transform(X, y)print(selected_data)
# [[2 3]
#  [5 6]
#  [8 9]]
  • 卡方检验

选择与目标变量相关性高的特征

# 卡方检验
import numpy as np
from sklearn.feature_selection import SelectKBest, chi2X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
selector = SelectKBest(chi2, k=2)
selected_data = selector.fit_transform(X, y)
print(selected_data)
# [[2 3]
#  [5 6]
#  [8 9]]

包裹法(Wrapper Methods)

包裹法通过训练模型来评估特征子集的性能

  • 递归特征消除(RFE)

递归地移除最不重要的特征

# 包裹法(Wrapper Methods)
# 递归特征消除(RFE)import numpy as np
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegressionX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
model = LogisticRegression()
selector = RFE(model, n_features_to_select=2)
selected_data = selector.fit_transform(X, y)
print(selected_data)
# [[1 3]
#  [4 6]
#  [7 9]]

嵌入法(Embedded Methods)

 嵌入法在模型训练过程中自动进行特征选择

  • L1正则化(Lasso回归)

通过L1正则化将不重要的特征权重压缩为0

# 嵌入法(Embedded Methods)
# 1. L1正则化(Lasso回归)
import numpy as np
from sklearn.linear_model import LassoX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
lasso = Lasso(alpha=0.1)
lasso.fit(X, y)
print(lasso.coef_)
# [0. 0. 0.]
  • 基于树模型的特征重要性

使用树模型(如随机森林)评估特征重要性

# 2. 基于树模型的特征重要性
import numpy as np
from sklearn.ensemble import RandomForestClassifierX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
y = np.array([1, 0, 1])
model = RandomForestClassifier()
model.fit(X, y)
print(model.feature_importances_)
# [0.37857143 0.30357143 0.31785714]

特征降维

特征降维是将高维特征投影到低维空间,常见的方法包括PCA和LDA

主成分分析(PCA)

通过线性变换将数据投影到方差最大的方向

## 特征降维
# 1. 主成分分析(PCA)
import numpy as np
from sklearn.decomposition import PCAX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(X)
print(reduced_data)
# [[-5.19615242e+00  3.62353582e-16]
#  [ 0.00000000e+00  0.00000000e+00]
#  [ 5.19615242e+00  3.62353582e-16]]

线性判别分析(LDA)

通过线性变换将数据投影到最大化类间区分度的方向

# 2. 线性判别分析(LDA)
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysisX = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
y = np.array([1, 0, 1, 2])
lda = LinearDiscriminantAnalysis(n_components=2) # 注意: n_components不能超过类别数量减1
reduced_data = lda.fit_transform(X, y)
print(reduced_data)
# [[ 1.06066017]
#  [ 0.35355339]
#  [-0.35355339]
#  [-1.06066017]]

自动特征生成

自动特征生成是通过工具或算法自动生成新的特征

使用Featuretools生成特征

自动从关系型数据中生成聚合和转换特征

## 自动特征生成
# 1. 使用Featuretools生成特征
import numpy as np
import featuretools as ft
import pandas as pd# 创建数据
data = pd.DataFrame({'transaction_id': range(1, 6),  # 添加 transaction_id 列'customer_id': [1, 2, 1, 2, 3],'amount': [100, 150, 200, 300, 500],'timestamp': pd.date_range('2025-01-01', periods=5)
})# 创建 EntitySet
es = ft.EntitySet(id='transactions')# 添加 transactions 数据
es.add_dataframe(dataframe=data,dataframe_name='transactions',index='transaction_id',  # 指定索引列time_index='timestamp'  # 指定时间索引列
)# 定义客户实体
customers = pd.DataFrame({'customer_id': [1, 2, 3]})# 添加 customers 数据
es.add_dataframe(dataframe=customers,dataframe_name='customers',index='customer_id'  # 指定索引列
)# 建立关系
es.add_relationship(parent_dataframe_name='customers',parent_column_name='customer_id',child_dataframe_name='transactions',child_column_name='customer_id'
)# 自动特征生成
feature_matrix, feature_defs = ft.dfs(entityset=es,target_dataframe_name='customers',agg_primitives=['mean', 'max', 'std'],trans_primitives=['day', 'month']
)print(feature_matrix)
#              MAX(transactions.amount)  ...  STD(transactions.amount)
# customer_id                            ...                          
# 1                               200.0  ...                 70.710678
# 2                               300.0  ...                106.066017
# 3                               500.0  ...                       NaN
#
# [3 rows x 3 columns]

特征交互

特征交互是通过组合特征来发现新的信息,常见的方法包括多项式特征和手动组合特征

多项式特征

生成特征的多项式组合

## 特征交互
# 1. 多项式特征
import numpy as np
from sklearn.preprocessing import PolynomialFeaturesX = np.array([[1, 2], [3, 4], [5, 6]])
poly = PolynomialFeatures(degree=2, include_bias=False)
poly_features = poly.fit_transform(X)
print(poly_features)
# [[ 1.  2.  1.  2.  4.]
#  [ 3.  4.  9. 12. 16.]
#  [ 5.  6. 25. 30. 36.]]

手动组合特征

根据业务知识手动组合特征

# 2. 手动组合特征
import pandas as pddata = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
data['A_plus_B'] = data['A'] + data['B']
data['A_times_B'] = data['A'] * data['B']
print(data)
#    A  B  A_plus_B  A_times_B
# 0  1  4         5          4
# 1  2  5         7         10
# 2  3  6         9         18

特征编码

特征编码是将非数值特征转换为数值特征,常见的方法包括独热编码(One-Hot Encoding)、标签编码(Label Encoding)和基于频率或目标的编码(Frequency/Target Encoding)

独热编码(One-Hot Encoding)

将分类特征转换为独热向量

## 特征编码
# 1. 独热编码(One-Hot Encoding)
from sklearn.preprocessing import OneHotEncoderdata = np.array([['cat'], ['dog'], ['bird']])
encoder = OneHotEncoder(sparse=False)
encoded_data = encoder.fit_transform(data)
print(encoded_data)
# [[0. 1. 0.]
#  [0. 0. 1.]
#  [1. 0. 0.]]

标签编码(Label Encoding)

将分类特征转换为整数标签

# 2. 标签编码(Label Encoding)
from sklearn.preprocessing import LabelEncoderdata = np.array(['cat', 'dog', 'bird'])
encoder = LabelEncoder()
encoded_data = encoder.fit_transform(data)
print(encoded_data)
# [1 2 0]

基于频率或目标的编码(Frequency/Target Encoding)

对于一些具有大量类别的分类特征,可以使用基于频率或目标的编码方法

  • 基于频率的编码(Frequency Encoding)

将每个类别值替换为它在数据集中出现的频率

# 3. 基于频率或目标的编码
# 3.1 基于频率的编码(Frequency Encoding)
import pandas as pd# 示例数据
data = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'C', 'B']})# 计算每个类别的频率
frequency_map = data['category'].value_counts(normalize=True).to_dict()# 替换类别值为频率
data['frequency_encoded'] = data['category'].map(frequency_map)
print(data)
#   category  frequency_encoded
# 0        A           0.333333
# 1        B           0.333333
# 2        A           0.333333
# 3        C           0.333333
# 4        B           0.333333
# 5        A           0.333333
# 6        C           0.333333
# 7        C           0.333333
# 8        B           0.333333
  • 基于目标的编码(Target Encoding)

将每个类别值替换为目标变量的统计值(如均值、中位数等)

# 3.2 基于目标的编码(Target Encoding)
import pandas as pd
import numpy as np# 示例数据
data = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'C', 'B'],'target': [1, 0, 1, 1, 0, 1, 0, 1, 0]
})# 计算每个类别的目标均值
target_mean = data.groupby('category')['target'].mean().to_dict()# 替换类别值为目标均值
data['target_encoded'] = data['category'].map(target_mean)
print(data)
#   category  target  target_encoded
# 0        A       1        1.000000
# 1        B       0        0.000000
# 2        A       1        1.000000
# 3        C       1        0.666667
# 4        B       0        0.000000
# 5        A       1        1.000000
# 6        C       0        0.666667
# 7        C       1        0.666667
# 8        B       0        0.000000
  • 基于目标的编码(平滑处理)

为了避免过拟合,结合全局目标均值和类别目标均值,通过平滑参数控制两者的权重

# 基于目标的编码(平滑处理)
import pandas as pd
import numpy as np# 示例数据
data = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'C', 'B'],'target': [1, 0, 1, 1, 0, 1, 0, 1, 0]
})# 全局目标均值
global_mean = data['target'].mean()# 每个类别的目标均值
target_mean = data.groupby('category')['target'].mean()# 类别出现的次数
category_count = data['category'].value_counts()# 平滑参数
alpha = 10# 计算平滑后的目标均值
smoothed_target_mean = (target_mean * category_count + global_mean * alpha) / (category_count + alpha)# 替换类别值为平滑后的目标均值
data['smoothed_target_encoded'] = data['category'].map(smoothed_target_mean)
print(data)
#   category  target  smoothed_target_encoded
# 0        A       1                 0.658120
# 1        B       0                 0.427350
# 2        A       1                 0.658120
# 3        C       1                 0.581197
# 4        B       0                 0.427350
# 5        A       1                 0.658120
# 6        C       0                 0.581197
# 7        C       1                 0.581197
# 8        B       0                 0.427350

时间特征提取

时间特征提取是从时间戳中提取有用信息,如年、月、日、小时等

## 时间特征提取
import pandas as pddata = pd.DataFrame({'timestamp': pd.date_range('2025-01-01', periods=5)})
data['year'] = data['timestamp'].dt.year
data['month'] = data['timestamp'].dt.month
data['day'] = data['timestamp'].dt.day
data['hour'] = data['timestamp'].dt.hour
print(data)
#    timestamp  year  month  day  hour
# 0 2025-01-01  2025      1    1     0
# 1 2025-01-02  2025      1    2     0
# 2 2025-01-03  2025      1    3     0
# 3 2025-01-04  2025      1    4     0
# 4 2025-01-05  2025      1    5     0

文本特征提取

文本特征提取是从文本数据中提取有用信息,常见的方法包括词袋模型(Bag of Words)和TF-IDF

词袋模型(Bag of Words)

将文本转换为单词频率向量

## 文本特征提取
# 1. 词袋模型(Bag of Words)
from sklearn.feature_extraction.text import CountVectorizercorpus = ['This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?']
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out()) # ['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
print(X.toarray())
# [[0 1 1 1 0 0 1 0 1]
#  [0 2 0 1 0 1 1 0 1]
#  [1 0 0 1 1 0 1 1 1]
#  [0 1 1 1 0 0 1 0 1]]

TF-IDF

将文本转换为TF-IDF权重向量

# 2. TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizercorpus = ['This is the first document.', 'This document is the second document.', 'And this is the third one.', 'Is this the first document?']
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names_out()) # ['and' 'document' 'first' 'is' 'one' 'second' 'the' 'third' 'this']
print(X.toarray())
# [[0.         0.46979139 0.58028582 0.38408524 0.         0.
#   0.38408524 0.         0.38408524]
#  [0.         0.6876236  0.         0.28108867 0.         0.53864762
#   0.28108867 0.         0.28108867]
#  [0.51184851 0.         0.         0.26710379 0.51184851 0.
#   0.26710379 0.51184851 0.26710379]
#  [0.         0.46979139 0.58028582 0.38408524 0.         0.
#   0.38408524 0.         0.38408524]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88375.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88375.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88375.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper

ChartMuseum 是 Kubernetes 生态中用于存储、管理和发布 Helm Charts 的开源系统,主要用于扩展 Helm 包管理器的功能 核心功能 ‌集中存储‌:提供中央化仓库存储Charts,支持版本管理和权限控制。 ‌ ‌跨集群部署‌:支持多集群环境…

C++编程学习(第二天)

1、求a和b两个数之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定义变量a、b、sumcout << "请输入第一个数字a: "; //打印需要显示的字符串cin >> a; // >&…

毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线

在老龄化加速与独居老人数量攀升的背景下&#xff0c;跌倒已成为威胁老年人生命安全的“隐形杀手”。七彩喜跌倒检测仪以毫米波雷达技术为核心&#xff0c;通过“非接触式监测智能预警”重塑居家安全防护体系&#xff0c;为银发群体构建起全天候、无感化的数字守护网。技术突破…

面试复盘:节流中第二次触发的事件?答错补课

面试复盘&#xff1a;节流中第二次触发的事件&#xff1f;答错补课 背景描述 今天面试时被问到一个看似基础但暗藏玄机的问题&#xff1a;“节流&#xff08;Throttle&#xff09;函数中&#xff0c;第二次触发的那一帧事件是否会被丢掉&#xff1f;” 我基于对经典节流实现的…

Spark伪分布式集群搭建(Ubuntu系统)

环境准备 系统要求&#xff1a;Ubuntu 20.04/22.04 LTS 软件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB内存&#xff0c;20GB磁盘空间 以下是基于Ubuntu系统的Spark伪分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】数据挖掘面试题0001:查找连续三天登录的用户

文章大纲一、测试数据构建二、自连接方案三、窗口函数方案一张用户表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是这么几项&#xff0c;查找连续三天登录的用户。 比如说&#xff0c;1,2两天登录不是连续三天&#xff0c;456登录为连续三天登录&#xff0c;56…

简说scp命令

简单介绍 scp的全称是&#xff1a;Secure Copy Protocol&#xff08;安全复制协议&#xff09;&#xff0c;是Linux中用于在网络中安全传输文件的命令行工具。它基于SSH协议&#xff0c;用于在本地服务器和远程服务器之间&#xff0c;或者两台远程服务器之间复制文件或目录。 s…

自动化测试解决方案Parasoft SOAtest无脚本UI测试实践指南

传统UI自动化测试常面临技术门槛高、维护成本大、稳定性差等挑战。尤其在页面频繁变更时&#xff0c;测试脚本的更新和维护会显著降低测试效率。 自动化测试解决方案Parasoft SOAtest通过可视化操作和智能元素定位技术&#xff0c;无需编写代码&#xff0c;让测试人员能够像真…

vscode配置头文件和编译器

在 VS Code 中配置编译器和头文件路径需要修改两个核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于构建&#xff09;。以下是详细步骤&#xff1a; —### 1. 配置智能提示和头文件路径 (c_cpp_properties.json)作…

HTML+JS+CSS制作一个数独游戏

闲来无事&#xff0c;用HTMLJSCSS制作了一个数独游戏消遣。其实主要是自己做题的时候用笔画删除数字太容易出错&#xff0c;所以想搞一个程序稍微辅助一下。通过制作这个程序&#xff0c;反而提高了手工做题的水平&#xff0c;至少学会了记录步数以便于回退。 20250710功能更新…

嵌入式硬件中电容的基本原理与实现详解02

我们今天重点讨论点知识点如下: 1.各种种类的电容优缺点对比讲解 2.电容的标称值介绍 3.电容的单位介绍 4.常见的电压信号有哪些? 5. 电容的耐压值讲解 6.电容的容值有哪些? 7.12pF、15pF 电容常用在什么场合? 8. 振荡电路中使用的电容常常需要使用什么材质的电容? 9.100n…

Python训练打卡DAY46

DAY46&#xff1a;通道注意力&#xff08;SE注意力&#xff09; 恩师浙大疏锦行 知识点&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通…

fastadmin_php专项

1.时间的判断,还有就是在php这边如何去拿前端html元素上面的值input($row.borrowtime);// 创建两个 DateTime 对象$row_expecttime new \DateTime(input($row.borrowtime));$par_expecttime new \DateTime( $params[expecttime]); // // 计算两个日期之间的差异 // …

如何在MySQL中选择使用InnoDB还是MyISAM引擎?

在 MySQL 中选择 InnoDB 还是 MyISAM 存储引擎时&#xff0c;需根据应用场景的需求权衡功能、性能和数据完整性。以下是具体的选择指南&#xff1a; 1. 优先考虑事务和外键需求必须使用 InnoDB&#xff1a; 若应用需要 事务支持&#xff08;如金融转账、订单处理&#xff09;或…

邀请函 | 知从科技邀您共赴2025 RISC-V 中国峰会

第五届RISC-V中国峰会将于2025年7月16至19日在上海张江科学会堂隆重举办&#xff0c;本届峰会由上海开放处理器产业创新中心&#xff08;SOPIC&#xff09;主办&#xff0c;RISC-V国际开源实验室&#xff08;RIOS实验室&#xff09;和上海张江高科技园区开发股份有限公司联合主…

企业数字化转型规划和建设方案(管理架构、应用架构、技术架构)PPT

一、战略定位与核心目标以 “技术赋能业务&#xff0c;数据驱动创新” 为核心思路&#xff0c;构建 “三步走” 战略演进路径&#xff0c;实现 IT 从 “基础支撑” 到 “战略引擎” 的升级&#xff1a;IT1.0&#xff08;1-2 年&#xff09;&#xff1a;夯实基础能力定位 “稳健…

基于Uniapp+MySQL+PHP的景区多商户小程序源码系统 带完整的搭建指南

温馨提示&#xff1a;文末有资源获取方式该系统采用 PHP MySQL 的经典开发组合。PHP 作为一种广泛使用的开源脚本语言&#xff0c;具有简单易学、运行速度快、跨平台性强等优点&#xff0c;能够快速开发出功能强大的 Web 应用程序。MySQL 则是一款稳定可靠的关系型数据库管理系…

阿里云和腾讯云RocketMQ 发消息和消费消息客户端JAVA接口

一、RocketMQ 概述RocketMQ 是阿里巴巴开源的一款分布式消息中间件&#xff0c;后捐赠给 Apache 基金会成为顶级项目。它具有低延迟、高并发、高可用、高可靠等特点&#xff0c;广泛应用于订单交易、消息推送、流计算、日志收集等场景。核心特点分布式架构&#xff1a;支持集群…

Vue响应式原理六:Vue3响应式原理

1. 多个对象响应式当前存在的问题&#xff1a;当前实现仅针对某个固定对象&#xff08;obj&#xff09;进行依赖收集&#xff0c;实际开发中需要处理多个不同对象将对象响应式处理逻辑抽取为通用函数&#xff0c;支持任意对象代码如下&#xff1a; // 方案一&#xff1a;Obje…

【算法笔记 day three】滑动窗口(其他类型)

hello大家好&#xff01;这份笔记包含的题目类型主要包括求子数组已经一些比较‘小众’的题目。和之前一样&#xff0c;笔记中的代码和思路要么是我手搓要么是我借鉴一些大佬的想法转化成自己的话复现。所以方法不一定是最好的&#xff0c;但一定是经过我理解的产物&#xff0c…