机器学习-特征工程与 sklearn 机器学习概述

发布于:2025-03-01 ⋅ 阅读:(165) ⋅ 点赞:(0)

一、特征工程概念

特征工程是对数据特征进行处理,将其转化为适合机器学习算法的数字特征的过程。其主要步骤包括:

  1. 特征提取:针对不同类型数据(如字典、文本等),提取有效特征,如字典特征提取、文本特征提取。
  2. 无量纲化(预处理):通过归一化和标准化等方法,消除数据特征间的量纲差异,使数据更适合模型训练。
  3. 降维:采用低方差过滤、主成分分析(PCA)等技术,减少特征数量,降低计算复杂度,同时保留重要信息。

通常使用 pandas 进行数据清洗和处理,使用 sklearn 进行特征工程操作。

二、特征工程 API

在 sklearn 中,特征工程相关的转换器类多为 Transformer 的子类,使用时需先实例化转换器对象,再调用 fit_transform () 方法进行转换(fit 用于计算数据,transform 用于最终转换,也可分开使用 fit () 和 transform ())。常用的转换器类包括:

  1. DictVectorizer:字典特征提取。
  2. CountVectorizer:文本特征提取。
  3. TfidfVectorizer:TF-IDF 文本特征词的重要程度提取。
  4. MinMaxScaler:归一化。
  5. StandardScaler:标准化。
  6. VarianceThreshold:低方差过滤降维。
  7. PCA:主成分分析降维。

三、具体特征工程方法

(一)DictVectorizer 字典列表特征提取

  1. 概念:将字典列表数据转换为矩阵或数组,涉及稀疏矩阵(大部分元素为零)和非稀疏矩阵(稠密矩阵)的概念。
  2. 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 文本特征提取

  1. API:sklearn.feature_extraction.text.CountVectorizer,可设置 stop_words 参数排除特定词汇。
  2. 英文文本提取示例

收起

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)

  1. 中文文本提取示例:需先使用 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 文本特征词的重要程度特征提取

  1. 算法原理:结合词频(TF)和逆文档频率(IDF),评估词在文本中的重要性。
  2. API:sklearn.feature_extraction.text.TfidfVectorizer (),可设置 stop_words 参数。
  3. 示例

收起

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())

(四)无量纲化 - 预处理

  1. 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)

  1. normalize 归一化:包括 L1、L2、max 归一化,分别以绝对值相加、平方相加、max 作为分母进行归一化。
  2. 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])

(五)特征降维

  1. 特征选择
    • 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)

  1. 主成份分析 (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 进行机器学习的流程如下:

  1. 实例化预估器 (估计器) 对象 (estimator):根据任务选择,如分类(KNeighborsClassifier、MultinomialNB 等)、回归(LinearRegression、Ridge)、无监督学习(KMeans)。
  2. 进行训练:estimator.fit(x_train, y_train)。
  3. 模型评估
    • 方式 1:对比 y_predict = estimator.predict (x_test) 和 y_test。
    • 方式 2:计算准确率 accuracy = estimator.score (x_test, y_test)。
  4. 使用模型 (预测):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)

网站公告

今日签到

点亮在社区的每一天
去签到