一、特征工程概念
特征工程是对数据特征进行处理,将其转化为适合机器学习算法的数字特征的过程。其主要步骤包括:
- 特征提取:针对不同类型数据(如字典、文本等),提取有效特征,如字典特征提取、文本特征提取。
- 无量纲化(预处理):通过归一化和标准化等方法,消除数据特征间的量纲差异,使数据更适合模型训练。
- 降维:采用低方差过滤、主成分分析(PCA)等技术,减少特征数量,降低计算复杂度,同时保留重要信息。
通常使用 pandas 进行数据清洗和处理,使用 sklearn 进行特征工程操作。
二、特征工程 API
在 sklearn 中,特征工程相关的转换器类多为 Transformer 的子类,使用时需先实例化转换器对象,再调用 fit_transform () 方法进行转换(fit 用于计算数据,transform 用于最终转换,也可分开使用 fit () 和 transform ())。常用的转换器类包括:
- DictVectorizer:字典特征提取。
- CountVectorizer:文本特征提取。
- TfidfVectorizer:TF-IDF 文本特征词的重要程度提取。
- MinMaxScaler:归一化。
- StandardScaler:标准化。
- VarianceThreshold:低方差过滤降维。
- PCA:主成分分析降维。
三、具体特征工程方法
(一)DictVectorizer 字典列表特征提取
- 概念:将字典列表数据转换为矩阵或数组,涉及稀疏矩阵(大部分元素为零)和非稀疏矩阵(稠密矩阵)的概念。
- API 及示例
收起
python
from sklearn.feature_extraction import DictVectorizer
data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33, 'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
# 创建DictVectorizer对象,设置sparse=False返回数组
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names_out())
(二)CountVectorizer 文本特征提取
- API:sklearn.feature_extraction.text.CountVectorizer,可设置 stop_words 参数排除特定词汇。
- 英文文本提取示例
收起
python
from sklearn.feature_extraction.text import CountVectorizer
data=["stu is well, stu is great", "You like stu"]
transfer = CountVectorizer(stop_words=["you","is"])
data_new = transfer.fit_transform(data)
print(data_new)
- 中文文本提取示例:需先使用 jieba 分词
收起
python
import jieba
from sklearn.feature_extraction.text import CountVectorizer
def cut(text):
return " ".join(list(jieba.cut(text)))
data = ["教育学会会长期间坚定支持民办教育事业!","热忱关心、扶持民办学校发展","事业做出重大贡献!"]
data_new = [cut(v) for v in data]
transfer = CountVectorizer(stop_words=['期间', '做出'])
data_final = transfer.fit_transform(data_new)
print(data_final.toarray())
print(transfer.get_feature_names_out())
(三)TfidfVectorizer TF-IDF 文本特征词的重要程度特征提取
- 算法原理:结合词频(TF)和逆文档频率(IDF),评估词在文本中的重要性。
- API:sklearn.feature_extraction.text.TfidfVectorizer (),可设置 stop_words 参数。
- 示例
收起
python
import jieba
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
def cut_words(text):
return " ".join(list(jieba.cut(text)))
data = ["教育学会会长期间,坚定支持民办教育事业!", "扶持民办,学校发展事业","事业做出重大贡献!"]
data_new = [cut_words(v) for v in data]
transfer = TfidfVectorizer(stop_words=['期间', '做出',"重大贡献"])
data_final = transfer.fit_transform(data_new)
pd.DataFrame(data_final.toarray(), columns=transfer.get_feature_names_out())
(四)无量纲化 - 预处理
- MinMaxScaler 归一化
- 公式: 将数据映射到指定区间(默认为 0 - 1)。
- API 及示例:sklearn.preprocessing.MinMaxScaler(feature_range)
收起
python
from sklearn.preprocessing import MinMaxScaler
data=[[12,22,4],[22,23,1],[11,23,9]]
transfer = MinMaxScaler(feature_range=(0, 1))
data_new = transfer.fit_transform(data)
print(data_new)
- normalize 归一化:包括 L1、L2、max 归一化,分别以绝对值相加、平方相加、max 作为分母进行归一化。
- StandardScaler 标准化
- 公式: 使数据均值为 0,标准差为 1。
- API 及示例:sklearn.preprocessing.StandardScaler
收起
python
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
df_data = pd.read_csv("src/dating.txt")
transfer = StandardScaler()
new_data = transfer.fit_transform(df_data)
print("DateFrame数据被归一化后:\n", new_data[0:5])
(五)特征降维
- 特征选择
- VarianceThreshold 低方差过滤特征选择:移除方差低于设定阈值的特征。
收起
python
from sklearn.feature_selection import VarianceThreshold
import pandas as pd
data=pd.DataFrame([[10,1],[11,3],[11,1],[11,5],[11,9],[11,3],[11,2],[11,6]])
transfer = VarianceThreshold(threshold=1)
data_new = transfer.fit_transform(data)
print("data_new:\n",data_new)
- 根据相关系数的特征选择:使用皮尔逊相关系数度量变量间线性相关性。
收起
python
from scipy.stats import pearsonr
import pandas as pd
data = pd.read_csv("src/factor_returns.csv")
data = data.iloc[:, 1:-2]
r1 = pearsonr(data["pe_ratio"], data["pb_ratio"])
print(r1.statistic)
print(r1.pvalue)
- 主成份分析 (PCA)
- 原理:通过线性变换找到新的坐标系统,使数据在新坐标轴上的投影保留最大方差。
- API 及示例:from sklearn.decomposition import PCA
收起
python
from sklearn.decomposition import PCA
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
# 降维后保留95%的信息
transfer = PCA(n_components=0.95)
data_new = transfer.fit_transform(data)
print("data_new:\n", data_new)
四、sklearn 机器学习概述
完成数据获取、处理和特征工程后,使用 sklearn 进行机器学习的流程如下:
- 实例化预估器 (估计器) 对象 (estimator):根据任务选择,如分类(KNeighborsClassifier、MultinomialNB 等)、回归(LinearRegression、Ridge)、无监督学习(KMeans)。
- 进行训练:estimator.fit(x_train, y_train)。
- 模型评估
- 方式 1:对比 y_predict = estimator.predict (x_test) 和 y_test。
- 方式 2:计算准确率 accuracy = estimator.score (x_test, y_test)。
- 使用模型 (预测):y_predict = estimator.predict(x_true)。
示例(以 KNeighborsClassifier 为例)
收起
python
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 加载数据
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 实例化预估器
clf = KNeighborsClassifier(n_neighbors=3)
# 训练模型
clf.fit(X_train, y_train)
# 模型评估
y_predict = clf.predict(X_test)
accuracy = clf.score(X_test, y_test)
print("预测结果:", y_predict)
print("准确率:", accuracy)
# 使用模型进行预测
new_data = [[5.1, 3.5, 1.4, 0.2]]
prediction = clf.predict(new_data)
print("新数据预测结果:", prediction)