从sklearn开始机器学习 1基本介绍和数据集操作

原创文章,转载请注明出处。

根据一个知乎大佬的答疑,决定机器学习的方式侧重于,从实战入手,哪个数学理论实在是太顶了,孩子顶不住,准备从Kaggle入手进行学习,等我熟悉了一些实战使用一丁点简单的模型之后再尝试熟悉理论,总之还得是理论与实践结合的。

入门当然是经典的泰坦尼克号啦,(虽然我也不知道为什么经典)开冲!!!

首先把一堆网址贴上

1.kaggle的泰坦尼克号 (挑了一个看起来比较经典的解) 全英文看起来有点不适

2.sklearn的英文社区

3.sklearn的中文社区 (好在有中文平替,以我的英文水平着实有点难受)

4.sklearn中文手册

下面就开始我们的学习之旅。

在sklearn有中有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理。

其中分类和回归是监督学习,聚类和降维是无监督学习

  • 常用的回归:线性、决策树、SVM、KNN ;集成回归:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
  • 常用的分类:线性、决策树、SVM、KNN,朴素贝叶斯;集成分类:随机森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
  • 常用聚类:k均值(K-means)、层次聚类(Hierarchical clustering)、DBSCAN
  • 常用降维:LinearDiscriminantAnalysis、PCA

加载数据集

sklearn还自带一些数据集,属于一些比较经典的数据集。

常见数据集如下:

模块 数据集 大小
load_iris() 鸢尾花数据集 150*4
load_boston() 波士顿房价数据 506*13
load_wine() 葡萄酒数据集 178*13
load_digits() 手写体数字光学识别数据集 1797*64
load_breast_cancer() 乳腺癌数据集 569*30
load_diabetes() 糖尿病数据集 442*10
load_linnerud() 体能训练 20*3
load_sample_images() 图像数据集(2个图像:中国和花朵) 427*640*3

除此之外还可以在线下载,生成,以及购买的。

  • 自带的小数据集(packaged dataset):sklearn.datasets.load_
  • 可在线下载的数据集(Downloaded Dataset):sklearn.datasets.fetch_
  • 计算机生成的数据集(Generated Dataset):sklearn.datasets.make_
  • svmlight/libsvm格式的数据集:sklearn.datasets.load_svmlight_file(…)
  • 从买了data.org在线下载获取的数据集:sklearn.datasets.fetch_mldata(…)

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from sklearn.linear_model import LogisticRegression
# 从回归模块中导入logistic回归
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier

#导入自带数据集示例
from sklearn.datasets import load_breast_cancer # 导入乳腺癌患者数据
cancer = load_breast_cancer() # 实例化对象
print(cancer.keys()) # 查看字典
print(cancer['data'].shape) # 查看数据结构
print(cancer['target'].shape) # 查看单个标签
# print(cancer['DESCR']) # 查看数据集介绍
print(cancer['filename']) # 查看数据集所处的位置

# 亦或者
from sklearn import datasets
iris = datasets.load_iris()
digits = datasets.load_digits()

加载后的数据集可以视为一个字典,几乎所有的 Sklearn 数据集均可以使用 data、target、feature_names、DESCR 分别获取数据集的数据、标签、特征名称和描述信息。

划分数据集

此处总结参考了此博客(很详细)

Sklearn 的 model selection 模块提供了 train_test_spilt 函数,能够对数据集进行拆分,其使用格式如下:

1
2
3
sklearn.model_selection.train_test_spilt(arrays,options)

X_train, X_test, y_train, y_test = train_test_split(train_data, train_target, test_size, random_state,shuffle)
参数名称 说明
arrays 接收一个或多个数据集。代表需要划分的数据集,若为分类、回归则分别传入数据和标签,若为聚类则传入数据。无默认。
train_size 接收float、int、None类型的数据。代表训练集的大小。该参数与test_size可以只传入一个。
test_size 接收float、int、None类型的数据。代表测试集的大小。该参数与train_size可以只传入一个。如果传入的数据为float类型则需要限定在0-1之间,代表测试集在总数中的占比;如果传入为int类型的数据,则表示测试集记录的绝对数目。
random_size 接收int。代表随机种子编号,相同随机种子编号产生相同的随机结果,不同的随机种子编号产生不同的随机结果。默认为None。
shuffle 接收boolean。代表是否进行有放回抽样。若该参数取值为True则stratify参数必须不能为空。
stratify 接收array或者None。如果不为None,则使用传入的标签进行分层抽样。

将数据集划分训练集和测试集,典型的划分方式是训练集占总样本的80%,测试集占总样本的20%:

  • 训练集 train set:用于训练模型
  • 验证集 validation set:用于训练过程中模型性能评估
  • 测试集 test set:用于检验最终的模型的性能

train_test_spilt 函数根据传入的数据,分别将传入的数据划分训练集和测试集。如果传入的是1组数据,那么生成的就是这一组数据随机划分后的训练集和测试集,总共2组。如果传入的是2组数据,则生成的训练集和测试集分别2组,总共4组。train_test_spilt 是最常用的数据划分方法,在 model_selection 模块中还提供了其他数据集划分的函数,如 PredefinedSplit、ShuffleSplit 等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from sklearn.datasets import load_iris          # 导入鸢尾花数据
iris = load_iris() # 实例化对象
print(iris.keys()) # 查看字典
print(iris['data'].shape) # 查看数据结构
print(iris['target'].shape) # 查看单个标签
# 运行结果:
dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])
(150, 4)
(150,)

# 划分数据集
from sklearn.model_selection import train_test_split
import pandas as pd
iris = load_iris()

# 拆分数据集 80%训练集,20%测试集
# stratify=iris['target'] 均匀抽取标签
X_train, X_test, y_train, y_test = train_test_split(iris['data'], iris['target'], test_size=0.2, stratify=iris['target'])

print(X_train.shape)
print(pd.Series(y_train).value_counts())
# 运行结果:
(120, 4)
2 40
1 40
0 40
dtype: int64

# 另一个例子
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)

关于X_train, X_test, y_train, y_test的解释如下:

  1. x_train:包括所有自变量,这些变量将用于训练模型,同样,我们已经指定测试_size=0.4,这意味着来自完整数据的60%的观察值将用于训练/拟合模型,其余40%将用于测试模型。
  2. y_train-这是因变量,需要此模型进行预测,其中包括针对自变量的类别标签,我们需要在训练/拟合模型时指定我们的因变量
  3. x_test:这是数据中剩余的40%的自变量部分,这些自变量将不会在训练阶段使用,并将用于进行预测,以测试模型的准确性。
  4. y_test-此数据具有测试数据的类别标签,这些标签将用于测试实际类别和预测类别之间的准确性。
  5. random_state:随机数种子,固定random_state后,每次构建的模型是相同的、生成的数据集是相同的、每次的拆分结果也是相同的

使用 Sklearn 转换器处理数据

在数据分析过程中,各类特征处理相关操作都需要对训练集和测试集分开操作,需要将训练集的操作规则、权重系数等应用到测试集中。如果使用 Pandas,则应用至测试集的过程相对繁琐,使用 sklearn 转化器(transformer)可以解决这一困扰。使用 Sklearn 转换器能够实现对传入的 Numpy 数组进行标准化处理、归一化处理、二值化处理、PCA 降维等操作。

函数名称 说明
MinMaxScaler 对特征进行离差标准化
StandardScaler 对特征进行标准差标准化
Normalizer 对特征进行归一化
Binarizer 对定量特征进行二值化处理
OneHotEncoder 对定性特征进行独热编码处理
FunctionTransformer 对特征进行自定义函数变换
1
2
3
4
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler().fit(X_train) # 利用训练集数据生成转化器
print(min_max_scaler.transform(X_train)) # 对训练集数据执行转化操作
print(min_max_scaler.transform(X_test)) # 对测试集数据执行转化操作

从sklearn开始机器学习 1基本介绍和数据集操作
https://steammilk.com/2022/10/28/2022-all/ML-1/
作者
蒸奶泡
发布于
2022年10月28日
更新于
2025年1月8日
许可协议