初始sklearn 数据集获取、分类、划分与特征工程

发布于:2025-08-01 ⋅ 阅读:(12) ⋅ 点赞:(0)

在机器学习项目中,高质量的数据处理流程是模型成功的基石。sklearn 提供了一整套高效工具链,助你轻松完成数据准备的核心步骤。


一、获取数据:你的分析原料库

关键要点:内置数据集与自定义加载

from sklearn import datasets

# 1. 加载内置经典数据集
iris = datasets.load_iris()  # 鸢尾花数据集
X, y = iris.data, iris.target  # 特征矩阵 & 目标向量

# 2. 生成模拟数据(控制特性)
X, y = datasets.make_classification(
    n_samples=1000, n_features=20, n_classes=2, random_state=42
)

# 3. 从CSV加载自定义数据
import pandas as pd
df = pd.read_csv('your_data.csv')
X = df.drop('target', axis=1)
y = df['target']

sklearn本地自带玩具数据集(练习所用):
在这里插入图片描述
联网数据集(获取会在外网下载,所以获取数据集会很慢):
在这里插入图片描述

注意: 内置数据集 (load_*) 快速验证算法,模拟数据 (make_*) 灵活控制参数,真实场景多用 pandas 加载外部数据。


二、理解任务:分类 vs 回归

关键要点:目标变量类型决定任务本质

from sklearn.datasets import load_diabetes

# 分类任务:目标为离散类别 (鸢尾花)
print("鸢尾花类别类型:", type(iris.target[0]))  # <class 'numpy.int64'>

# 回归任务:目标为连续数值 (糖尿病数据集)
diabetes = load_diabetes()
X_reg, y_reg = diabetes.data, diabetes.target
print("糖尿病目标类型:", type(y_reg[0]))  # <class 'numpy.float64'>

核心区别: 分类预测类别标签,回归预测连续数值。目标变量 y 的类型是判断依据。
分类类别会存在target_name来区分data中的每个数据的类型,分类预测粗略说就是通过data的feature_name中的每列数据传入模型中,训练模型,然后通过传入一些新的特征,让模型通过之前已给出的训练数据预测新的特征分类。
回归预测会在后续的线性回归中详细提及,而回归预测也是当前常用的方式。

三、划分数据:构建可靠评估基础

关键要点:防止信息泄露与评估偏差

from sklearn.model_selection import train_test_split

# 基础划分 (70%训练,30%测试)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.3, random_state=42
)

# 分层抽样(分类问题保持类别比例)
X_train_strat, X_test_strat, y_train_strat, y_test_strat = train_test_split(
    X, y, test_size=0.3, stratify=y, random_state=42
)

务必设置 random_state 保证可复现性;分类问题优先使用 stratify=y 保持数据分布一致性。


四、特征工程:释放数据潜能

特征提取

文本特征提取使用CountVectorizer

#提取英文文本特征
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
data=["stu is well, stu is great", "You like stu"]
#创建转换器对象, you和is不提取
transfer = CountVectorizer(stop_words=["you","is"])
#进行提取,得到稀疏矩阵
data_new = transfer.fit_transform(data)
print(data_new)

import pandas
pandas.DataFrame(data_new.toarray(), 
                 index=["第一个句子","第二个句子"],
                 columns=transfer.get_feature_names_out())

#提取中文文本需借用jieba工具
import jieba
def cut(text):
    return " ".join(list(jieba.cut(text)))
    
data = "在如今的互联网世界,正能量正成为澎湃时代的大流量"
data = cut(data)
print(data) #"在 如今 的 互联网 世界 , 正 能量 正 成为 澎湃 时代 的 大 流量"


#提取文本在文档中的稀有程度使用TfidfVectorizer
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())

无量纲化处理

即归一化处理
无量纲,即没有单位的数据

无量纲化包括"归一化"和"标准化", 为什么要进行无量纲化呢?

这是一个男士的数据表:

编号id 身高 h 收入 s 体重 w
1 1.75(米) 15000(元) 120(斤)
2 1.5(米) 16000(元) 140(斤)
3 1.6(米) 20000(元) 100(斤)

假设算法中需要求它们之间的欧式距离, 这里以编号1和编号2为示例:

L=(1.75−1.5)2+(15000−16000)2+(120−140)2L = \sqrt{(1.75-1.5)^2+(15000-16000)^2+(120-140)^2}L=(1.751.5)2+(1500016000)2+(120140)2

从计算上来看, 发现身高对计算结果没有什么影响, 基本主要由收入来决定了,但是现实生活中,身高是比较重要的判断标准. 所以需要无量纲化.

(1) MinMaxScaler 归一化

通过对原始数据进行变换把数据映射到指定区间(默认为0-1)

归一化公式:

在这里插入图片描述

这里的 𝑥min 和 𝑥max 分别是每种特征中的最小值和最大值,而 𝑥是当前特征值,𝑥scaled 是归一化后的特征值。

若要缩放到其他区间,可以使用公式:x=x*(max-min)+min;

比如 [-1, 1]的公式为:

手算过程:
在这里插入图片描述
API使用

#列表
from sklearn.preprocessing import MinMaxScaler
data=[[12,22,4],[22,23,1],[11,23,9]]
#feature_range=(0, 1)表示归一化后的值域,可以自己设定
transfer = MinMaxScaler(feature_range=(0, 1))
#data_new的类型为<class 'numpy.ndarray'>
data_new = transfer.fit_transform(data)
print(data_new)


#DataFrame
from sklearn.preprocessing import MinMaxScaler
import pandas as pd;
data=[[12,22,4],[22,23,1],[11,23,9]]
data = pd.DataFrame(data=data, index=["一","二","三"], columns=["一列","二列","三列"])
transfer = MinMaxScaler(feature_range=(0, 1))
data_new = transfer.fit_transform(data)
print(data_new)


#ndarray
from sklearn.feature_extraction import DictVectorizer
from sklearn.preprocessing import MinMaxScaler

data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33, 'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
transfer = DictVectorizer(sparse=False)
data = transfer.fit_transform(data) #data类型为ndarray
print(data)

transfer = MinMaxScaler(feature_range=(0, 1))
data = transfer.fit_transform(data)
print(data)

缺点:最大值和最小值容易受到异常点影响,所以鲁棒性较差。所以常使用标准化的无量钢化

(2)normalize归一化

L1归一化
绝对值相加作为分母,特征值作为分子

L2归一化
平方相加作为分母,特征值作为分子

max归一化
max作为分母,特征值作为分子

API使用

from sklearn.preprocessing import normalize
normalize(data, norm='l2', axis=1)
#data是要归一化的数据
#norm是使用那种归一化:"l1"  "l2"  "max
#axis=0是列  axis=1是行
(3)StandardScaler 标准化

最常见的标准化方法是Z-score标准化,也称为零均值标准化。它通过对每个特征的值减去其均值,再除以其标准差,将数据转换为均值为0,标准差为1的分布。这可以通过以下公式计算:


实例:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
# 1、获取数据
df_data = pd.read_csv("src/dating.txt")
print(type(df_data)) #<class 'pandas.core.frame.DataFrame'>
print(df_data.shape) #(1000, 4)

# 2、实例化一个转换器类
transfer = StandardScaler()

# 3、调用fit_transform
new_data = transfer.fit_transform(df_data) #把DateFrame数据进行归一化
print("DateFrame数据被归一化后:\n", new_data[0:5])

nd_data = df_data.values #把DateFrame转为ndarray
new_data = transfer.fit_transform(nd_data) #把ndarray数据进行归一化
print("ndarray数据被归一化后:\n", new_data[0:5])

nd_data = df_data.values.tolist() #把DateFrame转为list
new_data = transfer.fit_transform(nd_data) #把ndarray数据进行归一化
print("list数据被归一化后:\n", new_data[0:5])

其中,z是转换后的数值,x是原始数据的值,μ是该特征的均值,σ是该特征的 标准差

核心原则:

  • 在训练集上 fit_transform,测试集仅 transform

五、完整流程示例:鸢尾花分类

# 获取数据
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 划分数据 (分层抽样)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=42
)

# 特征工程 (标准化)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)  # 使用训练集的参数

# 训练模型 (如SVM)
from sklearn.svm import SVC
model = SVC(kernel='linear')
model.fit(X_train_scaled, y_train)

# 评估
print("测试集准确率:", model.score(X_test_scaled, y_test))

关键要点总结

步骤 核心工具 关键注意事项
数据获取 datasets.load_*, make_*, pandas 理解数据集结构
任务识别 观察目标变量y类型 分类(离散) vs 回归(连续)
数据划分 train_test_split 设置random_state, 分类问题用stratify
特征工程 文本提取,无量纲化, 预处理类 训练/测试集分开处理,避免数据泄露

熟练运用 sklearn 的数据处理工具箱,能将原始数据转化为模型可理解的“语言”,为构建高性能机器学习模型奠定坚实基础。每一步的严谨性都直接影响最终结果的可靠性。


网站公告

今日签到

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