机器学习终极指南:特征工程(02/2) — 第 -2 部分

接上文:机器学习终极指南:特征工程(01/2) 

五、处理不平衡数据

        处理不平衡的数据是机器学习的一个重要方面。不平衡数据是指目标变量的分布不均匀,并且与另一个类相比,一个类的代表性不足。这可能导致模型中偏向多数类,并且模型在少数类上的表现可能很差。处理不平衡数据的一些技术是:

        1. 上采样:上采样涉及通过对现有样本进行替换重新采样,为少数类创建更多样本。这可以使用模块中的函数来完成。resamplesklearn.utils

from sklearn.utils import resample# Upsample minority class
X_upsampled, y_upsampled = resample(X_minority, y_minority, replace=True, n_samples=len(X_majority), random_state=42)

        2. 缩减采样:缩减采样涉及从多数类中删除一些样本以平衡分布。这可以使用模块中的函数来完成。resamplesklearn.utils

from sklearn.utils import resample# Downsample majority class
X_downsampled, y_downsampled = resample(X_majority, y_majority, replace=False, n_samples=len(X_minority), random_state=42)

https://www.analyticsvidhya.com/blog/2020/07/10-techniques-to-deal-with-class-imbalance-in-machine-learning/

图 4 — 欠采样和过采样

        3. 合成少数过采样技术 (SMOTE):SMOTE 涉及基于现有样本为少数类创建合成样本。这可以使用模块中的函数来完成。SMOTEimblearn.over_sampling

from imblearn.over_sampling import SMOTE# Use SMOTE to upsample minority class
sm = SMOTE(random_state=42)
X_resampled, y_resampled = sm.fit_resample(X, y)

        4. 类加权:类加权涉及为模型中的每个类分配一个权重以解决不平衡。这可以使用模型中的参数来完成。class_weight

from sklearn.linear_model import LogisticRegression# Use class weighting to handle imbalance
clf = LogisticRegression(class_weight='balanced', random_state=42)
clf.fit(X_train, y_train)

        5. 异常检测:异常检测涉及识别数据中的异常值并将其删除。这可以使用模块中的函数来完成。异常检测可识别数据集中明显偏离预期或正常行为的罕见事件或观测值。对于不平衡数据,其中一个类中的观测值数量远低于另一个类,则异常检测可用于识别少数类中的罕见观测值并将其标记为异常。这有助于平衡数据集并提高机器学习模型的性能。IsolationForestsklearn.ensemble

        在不平衡数据中进行异常检测的一种常见方法是使用无监督学习技术,例如聚类,其中少数类观察根据其相似性聚类为不同的组。少数类中不属于任何这些聚类的观测值可以标记为异常。

        另一种方法是使用监督学习技术,例如单类分类,其中模型在多数类数据上训练以学习数据的正常行为。然后,明显偏离学习正常行为的少数类观察结果被标记为异常。

from sklearn.ensemble import IsolationForest# Use anomaly detection to handle imbalance
clf = IsolationForest(random_state=42)
clf.fit(X_train)
X_train = X_train[clf.predict(X_train) == 1]
y_train = y_train[clf.predict(X_train) == 1]

        6. 成本敏感学习:成本敏感学习涉及为模型中的每种类型的错误分配不同的成本以解释不平衡。这可以使用模型中的参数来完成。sample_weight


from sklearn.tree import DecisionTreeClassifier# Use cost-sensitive learning to handle imbalance
clf = DecisionTreeClassifier(random_state=42)
clf.fit(X_train, y_train, sample_weight=class_weights)

六、偏度和峰度处理

        偏度和峰度是有助于理解数据分布的统计度量。偏度测量数据中的不对称程度,而峰度测量分布的峰值或平坦程度。

https://corporatefinanceinstitute.com/resources/data-science/skewness/

图例.5 — 偏度

        偏斜的数据可能会对机器学习模型的性能产生负面影响。因此,处理数据中的偏度非常重要。以下是处理数据偏度的一些技术:

  1. 对数转换:对数转换可用于减少数据的偏度。它可以应用于正偏斜和负偏斜数据。
  2. 平方根变换:平方根变换可用于降低数据的偏度。它可以应用于正偏斜数据。
  3. Box-Cox 变换:Box-Cox 变换是一种更通用的变换方法,可以处理正偏斜和负偏斜数据。它使用参数 lambda 来确定要应用于数据的转换类型。

        下面是一些用于演示这些转换的 Python 代码:

import numpy as np
import pandas as pd
from scipy import stats# Generate some skewed data
data = np.random.gamma(1, 10, 1000)# Calculate skewness and kurtosis
skewness = stats.skew(data)
kurtosis = stats.kurtosis(data)print("Skewness:", skewness)
print("Kurtosis:", kurtosis)# Log transformation
log_data = np.log(data)
log_skewness = stats.skew(log_data)
log_kurtosis = stats.kurtosis(log_data)print("Log Skewness:", log_skewness)
print("Log Kurtosis:", log_kurtosis)# Square root transformation
sqrt_data = np.sqrt(data)
sqrt_skewness = stats.skew(sqrt_data)
sqrt_kurtosis = stats.kurtosis(sqrt_data)print("Sqrt Skewness:", sqrt_skewness)
print("Sqrt Kurtosis:", sqrt_kurtosis)# Box-Cox transformation
box_cox_data, _ = stats.boxcox(data)
box_cox_skewness = stats.skew(box_cox_data)
box_cox_kurtosis = stats.kurtosis(box_cox_data)print("Box-Cox Skewness:", box_cox_skewness)
print("Box-Cox Kurtosis:", box_cox_kurtosis)

        可以通过应用类似于处理偏度的转换来处理峰度。处理峰度的一些技术包括:

  1. 对数转换:对数转换也可用于处理数据中的峰度。
  2. 平方变换:平方变换还可用于处理数据中的峰度。
  3. Box-Cox 变换:Box-Cox 变换还可用于处理数据中的峰度。

https://www.scribbr.com/statistics/kurtosis/

图片.6 — 峰度

        下面是一些用于演示这些转换的 Python 代码:

import numpy as np
import pandas as pd
from scipy import stats# Generate some data with high kurtosis
data = np.random.normal(0, 5, 1000)**3# Calculate skewness and kurtosis
skewness = stats.skew(data)
kurtosis = stats.kurtosis(data)print("Skewness:", skewness)
print("Kurtosis:", kurtosis)# Log transformation
log_data = np.log(data)
log_skewness = stats.skew(log_data)
log_kurtosis = stats.kurtosis(log_data

七、处理稀有类别

        处理稀有类别是指处理数据中不经常出现的分类变量中的类别的过程。稀有类别可能会导致机器学习模型中出现问题,因为它们在数据中可能没有足够的表示来准确建模。处理稀有类别的一些技术包括:

  1. 对稀有类别进行分组: 这涉及将稀有类别分组为单个类别或几个类别。这将减少变量中的类别数并增加稀有类别的表示形式。
  2. 将稀有类别替换为更常见的类别:这涉及将稀有类别替换为变量中最常见的类别。如果稀有类别对分析不重要,则这可能有效。
  3. 带有标志的独热编码:这涉及为稀有类别创建新类别并将其标记为稀有。这允许模型以不同于其他类别的方式处理稀有类别。

以下是如何使用泰坦尼克号数据集处理稀有类别的示例:

import pandas as pd
import numpy as np# load Titanic dataset
titanic = pd.read_csv('titanic.csv')# view value counts of the 'Embarked' column
print(titanic['Embarked'].value_counts())# group rare categories into a single category
titanic['Embarked'] = np.where(titanic['Embarked'].isin(['C', 'Q']), titanic['Embarked'], 'R')# view value counts of the 'Embarked' column after grouping
print(titanic['Embarked'].value_counts())# replace rare categories with the most common category
titanic['Embarked'] = np.where(titanic['Embarked'].isin(['C', 'Q']), titanic['Embarked'], 'S')# view value counts of the 'Embarked' column after replacement
print(titanic['Embarked'].value_counts())# create a new category for rare categories and flag them as rare
titanic['Embarked_R'] = np.where(titanic['Embarked'].isin(['C', 'Q']), 0, 1)

八、处理时间序列数据

        处理时间序列数据涉及多种技术,例如数据预处理、特征提取和建模。让我们来看看一些技术以及如何使用 Python 实现它们。

图例.7 — 时间序列数据

        1. 数据预处理:时间序列数据通常包含可能影响模型性能的缺失值、异常值和噪声数据。因此,在训练模型之前预处理数据至关重要。数据预处理的一些常见技术包括插补、处理异常值和缩放。

        2. 特征提取:特征提取涉及从可用于建模的时间序列数据中提取相关信息。一些流行的特征提取技术包括滚动统计、傅里叶变换和小波变换。

        3. 建模:一旦数据经过预处理并提取了特征,就可以将其用于建模。一些流行的时间序列数据模型包括ARIMA:自回归积分移动平均线(ARIMA),LSTM:长短期记忆(LSTM)和Prophet。

        让我们看一个如何在 Python 中实现这些技术的示例:

# Import libraries
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from statsmodels.tsa.arima_model import ARIMA
from keras.models import Sequential
from keras.layers import LSTM, Dense# Load time-series data
data = pd.read_csv('time_series_data.csv')# Preprocess data
data.fillna(method='ffill', inplace=True)
data = data[(data['date'] > '2020-01-01') & (data['date'] < '2021-12-31')]
data.set_index('date', inplace=True)
scaler = StandardScaler()
data = scaler.fit_transform(data)# Extract features
rolling_mean = data.rolling(window=7).mean()
fft = np.fft.fft(data)
wavelet = pywt.dwt(data, 'db1')# Train ARIMA model
model = ARIMA(data, order=(1, 1, 1))
model_fit = model.fit(disp=0)
predictions = model_fit.predict(start='2022-01-01', end='2022-12-31')# Train LSTM model
X_train, y_train = [], []
for i in range(7, len(data)):X_train.append(data[i-7:i, 0])y_train.append(data[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))# Define the LSTM model
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=1))# Compile the model
model.compile(optimizer='adam', loss='mean_squared_error')# Fit the model to the training data
model.fit(X_train, y_train, epochs=100, batch_size=32)

九、文本预处理

        在处理文本数据时,文本预处理是特征工程中的关键步骤。目标是将原始文本转换为可用于机器学习模型的数字表示形式。以下是 Python 中一些常见的文本预处理技术:

  1. 标记化:这涉及将句子或文档分解为单独的单词或短语。NLTK 库提供了各种分词器,例如单词分词器和句子分词器。
from nltk.tokenize import word_tokenize, sent_tokenizetext = "This is a sample sentence. It contains some words."
words = word_tokenize(text)
sentences = sent_tokenize(text)print(words)
# Output: ['This', 'is', 'a', 'sample', 'sentence', '.', 'It', 'contains', 'some', 'words', '.']print(sentences)
# Output: ['This is a sample sentence.', 'It contains some words.']

        2.停用词删除:停用词是经常出现的不给文本添加任何含义的单词,例如“a”、“the”、“and”等。删除停用词可以提高文本处理的效率并减小数据的大小。NLTK 库提供了各种语言的停用词列表。

from nltk.corpus import stopwordsstop_words = set(stopwords.words('english'))
filtered_words = [word for word in words if word.casefold() not in stop_words]print(filtered_words)
# Output: ['sample', 'sentence', '.', 'contains', 'words', '.']

图片.8 — 文本处理

        3. 词干提取和词形还原:词干提取和词形还原是用于将单词简化为其基本形式或词根形式的技术。例如,“跑步”、“跑步者”和“跑步”可以简化为词根“跑步”。NLTK 库提供了各种词干分析器和词形还原器。

from nltk.stem import PorterStemmer, WordNetLemmatizerstemmer = PorterStemmer()
lemmatizer = WordNetLemmatizer()stemmed_words = [stemmer.stem(word) for word in filtered_words]
lemmatized_words = [lemmatizer.lemmatize(word) for word in filtered_words]print(stemmed_words)
# Output: ['sampl', 'sentenc', '.', 'contain', 'word', '.']print(lemmatized_words)
# Output: ['sample', 'sentence', '.', 'contains', 'word', '.']

        4.文本规范化:文本规范化涉及将文本转换为标准化形式,例如将所有文本转换为小写,删除标点符号,将缩写和缩略替换为其完整形式。

import redef normalize_text(text):text = text.lower()text = re.sub(r'[^\w\s]', '', text)text = re.sub(r'\b(can\'t|won\'t|shouldn\'t)\b', 'not', text)text = re.sub(r'\b(i\'m|you\'re|he\'s|she\'s|it\'s|we\'re|they\'re)\b', 'be', text)return texttext = "I can't believe it's not butter!"
normalized_text = normalize_text(text)print(normalized_text)
# Output: 'i not believe be not butter'

十、结论

        总之,特征工程是机器学习过程中的关键步骤,涉及将原始数据转换为机器学习算法可以有效使用的格式。在这篇博文中,我们介绍了特征工程的各种技术,包括特征选择和提取、编码分类变量、缩放和归一化、创建新特征、处理不平衡数据、处理偏度和峰度、处理稀有类别、处理时间序列数据、特征转换和文本预处理。

        以下是这篇文章的关键要点:

  1. 特征选择和提取可以使用统计方法(如 PCA、LDA 和相关分析)以及机器学习方法(如基于树的方法、包装方法和嵌入式方法)来完成。
  2. 可以使用独热编码、标签编码和计数编码等技术对分类变量进行编码。
  3. 缩放和规范化可以使用最小-最大缩放、标准缩放和可靠缩放等技术来完成。
  4. 文本预处理涉及标记化、停用词删除、词干提取和词形还原等技术。

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

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

相关文章

[内网渗透]CFS三层靶机渗透

文章目录 [内网渗透]CFS三层靶机渗透网络拓扑图靶机搭建Target10x01.nmap主机探活0x02.端口扫描0x03.ThinkPHP5 RCE漏洞拿shell0x04.上传msf后门(reverse_tcp)反向连接拿主机权限 内网渗透Target2&#xff08;1&#xff09;路由信息探测&#xff08;2&#xff09;msf代理配置&a…

两个数组的交集-C语言/Java

描述 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 输入…

yolov5代码解读之train.py【训练模型】

哇咔咔&#xff0c;登场 代码开头都是一些导包到模块的&#xff1a; 接下来来到入口函数&#xff1a; 我们直接来到main函数的内容&#xff1a;&#xff08;分四个部分&#xff09; 前两部分&#xff1a; 关于main函数的第二部分中的resume参数&#xff08;496行&#xff09;&…

概率图模型(Probabilistic Graphical Model,PGM)

概率图模型&#xff08;Probabilistic Graphical Model&#xff0c;PGM&#xff09;&#xff0c;是一种用图结构来描述多元随机变量之间条件独立性的概率模型。它可以用来表示复杂的概率分布&#xff0c;进行有效的推理和学习&#xff0c;以及解决各种实际问题&#xff0c;如图…

mysql延时问题排查

背景介绍 最近遇到一个奇怪的问题&#xff0c;有个业务&#xff0c;每天早上七点半产生主从延时&#xff0c;延时时间12.6K&#xff1b; 期间没有抽数/备份等任务&#xff1b;查看慢日志发现&#xff0c;期间有一个delete任务&#xff0c;在主库执行了161s delete from xxxx_…

人类:我觉得1+1=956446,你觉得呢?大模型:啊对对对

大模型太「听话」了怎么办&#xff1f; 大型语言模型&#xff08;LLM&#xff09;的自然语言理解与生成能力一直备受称赞&#xff0c;特别是 ChatGPT 等对话式语言模型能够与人类流畅、自然地进行多轮对话。然而&#xff0c;最近一篇 Google DeepMind 的论文研究发现 LLM 普遍存…

企业权限管理(八)-登陆使用数据库认证

Spring Security 使用数据库认证 在 Spring Security 中如果想要使用数据进行认证操作&#xff0c;有很多种操作方式&#xff0c;这里我们介绍使用 UserDetails 、 UserDetailsService来完成操作。 UserDetails public interface UserDetails extends Serializable { Collecti…

转义字符\

转移字符&#xff0c;就是通过字符&#xff0c;来转变原来字符的意思 常见的转义字符&#xff1a; 1、 2 注&#xff1a;" 的作用和他是类似的 3 4、 当打印\a时&#xff0c;电脑会出现一个警告&#xff0c;蜂鸣的声音 5、 阿斯克码表

机器学习---对数几率回归

1. 逻辑回归 逻辑回归&#xff08;Logistic Regression&#xff09;的模型是一个非线性模型&#xff0c; sigmoid函数&#xff0c;又称逻辑回归函数。但是它本质上又是一个线性回归模型&#xff0c;因为除去sigmoid映射函 数关系&#xff0c;其他的步骤&#xff0c;算法都是…

行业追踪,2023-08-09

自动复盘 2023-08-09 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Apache RocketMQ 命令注入

漏洞简介 RocketMQ 5.1.0及以下版本&#xff0c;在一定条件下&#xff0c;存在远程命令执行风险。RocketMQ的NameServer、Broker、Controller等多个组件外网泄露&#xff0c;缺乏权限验证&#xff0c;攻击者可以利用该漏洞利用更新配置功能以RocketMQ运行的系统用户身份执行命…

Java代理模式——静态代理与动态代理

代理模式 代理模式允许你为其他对象提供一个代理&#xff0c;以控制对这个对象的访问。代理模式在不改变实际对象的情况下&#xff0c;可以在访问对象时添加额外的功能。 可以理解为代理模式为被代理对象创造了一个替身&#xff0c;调用者可以通过这个替身去实现这个被代理对…

网络安全 Day30-容器架构上

容器架构上 1. 容器架构1.1 什么是容器1.2 容器 vs 虚拟机(化) :star::star:1.3 Docker极速上手指南1&#xff09;使用rpm包安装docker2) docker下载镜像加速的配置3) 载入镜像大礼包&#xff08;老师资料包中有&#xff09; 1.4 Docker使用案例1&#xff09; 案例01&#xff1…

【算法篇C++实现】常见查找算法

文章目录 &#x1f680;一、预备知识⛳&#xff08;一&#xff09;查找的定义⛳&#xff08;二&#xff09;数组和索引 &#x1f680;二、二分查找&#x1f680;三、穷举搜索&#x1f680;四、并行搜索⛳&#xff08;一&#xff09;并发的基本概念⛳&#xff08;二&#xff09;…

行业追踪,2023-08-10

自动复盘 2023-08-10 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

关于MPU6050的VLOGIC引脚作用

关键字&#xff1a;MPU6X0X、 MPU6050、数字逻辑电平、VLOGIC 框图&#xff1a; 一、VLOGIC引脚作用? VLOGIC引脚主要用于设置为I2C供电引脚&#xff0c;以保证正确的I2C通信。 The bias and LDO section generates the internal supply and the reference voltages and cu…

轻松转换TS视频为MP4,实现优质视频剪辑体验

如果你是一个视频剪辑爱好者&#xff0c;你一定会遇到各种视频格式之间的转换问题&#xff0c;特别是将TS视频转换为MP4格式。别担心&#xff0c;我们的视频剪辑软件将为你提供最简单、高效的解决方案&#xff01; 首先第一步&#xff0c;我们要进入媒体梦工厂主页面&#xff…

Three.js 实现材质边缘通道发光效果

相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组合在一起创建特定的视觉效果&#xff09; 2. RenderPass(是用于渲染场景的通道。它将场景和相机作为输入&#xff0c;使用Three.…

【STM32】FreeRTOS消息队列和信号量学习

一、消息队列&#xff08;queue&#xff09; 队列是一种用于实现任务与任务之间&#xff0c;任务与中断之间消息交流的机制。 注意&#xff1a;1.数据的操作是FIFO模式。 2.队列需要明确数据的大小和队列的长度。 3.写和读都会出现堵塞。 实验&#xff1a;创建一个消息队列…

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同&#xff1f; 一个进程是一个独立(self contained)的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…