SKLearn是什么
- Scikit-learn(简称sklearn)是一个用于机器学习的Python库,它包含了许多常用的机器学习算法、预处理技术、模型选择和评估工具等,可以方便地进行数据挖掘和数据分析。
- 它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。
- 在 Sklearn 里面有六大任务模块:分别是分类、回归、聚类、降维、模型选择和预处理
SVM是什么
- 基本思想是利用最大间隔进行分类
- 处理非线性问题是通过核函数将特征向量映射到高维空间,从而变成线性可分的,但是运算却是在低维空间运行的
球叫做 「data」(数据源),棍子叫做 「classifier」(分类器), 最大间隙trick 叫做「optimization」(最优化), 拍桌子叫做「kernelling」(建立核函数), 那张纸叫做「hyperplane」(超平面)
MNIST是什么
MNIST是一个数据集,由n个不同人手写的数字构成,每张图片是28 × 28 28\times 2828×28的0 − 9的手写数字图片组成。
机器学习步骤
- 数据的收集和准备 → 包括数据的清洗、变换、归一化和特征提取等操作;
- 模型选择和训练 → 选择一个合适的机器学习模型,并使用收集的数据对其进行训练(什么问题选择什么模型);
- 模型评估 → 训练完成后对模型在新数据上的表现进行评估;
- 模型部署和优化 → 将模型部署到实际环境中,并对其进行优化,包括压缩、加速、调参;
正文开始,打开PyCharm
一、准备数据
安装sklearn
终端输入
pip install -U scikit-learn
导入数据
- 在skleran中获取数据通常采用两种方式,一种是使用自带的数据集,另一种是创建数据集
- 自带的数据集有:鸢尾花数据集:load_iris() 手写数字数据集:load_digitals() 糖尿病数据集:load_diabetes() 乳腺癌数据集:load_breast_cancer() 波士顿房价数据集:load_boston() 体能训练数据集:load_linnerud()
#导入sklearn的数据集
import sklearn.datasets as sk_datasets
digitals = sk_datasets.load_digits()
digitals_X = digitals.data #导入数据
digitals_y = digitals.target #导入标签
创建数据集
- sklearn.datasets._samples_generator中包含了大量创建样本数据的方法。
sklearn.datasets.make_classification
函数生成一个人工分类数据集,并将特征数据存储在X
中,目标标签存储在y
中。
import sklearn.datasets._samples_generator as sk_sample_generator
X,y=sk_sample_generator.make_classification(n_samples=6,n_features=5,n_informative=2,n_redundant=3,n_classes=2,n_clusters_per_class=2,scale=1,random_state=20)
for x_,y_ in zip(X,y):
print(y_,end=": ")
print(x_)
下面是各个参数的解释,通过调整这些参数的值,可以生成不同的分类数据集:
-
n_samples
:生成的样本数量。在这个例子中,生成6个样本。 -
n_features
:生成的特征数量。在这个例子中,生成5个特征。 -
n_informative
:在生成的特征中有意义(相关)的特征数量。在这个例子中,有2个特征是有意义的。 -
n_redundant
:在生成的特征中是冗余(不相关)的特征数量。在这个例子中,有3个特征是冗余的。 -
n_classes
:生成的类别数量。在这个例子中,生成2个类别。 -
n_clusters_per_class
:每个类别中的簇(聚类)数量。在这个例子中,每个类别有2个簇。 -
scale
:控制数据集中特征的标准差。在这个例子中,特征的标准差为1。 -
random_state
:随机数种子。它用于确定数据集的随机性。在这个例子中,使用随机种子20来确保结果的可重复性。
数据集划分
- sklearn中的model_selection为我们提供了划分数据集的方法,常分为训练集,测试集。
根据给定的参数,train_test_split
函数将特征数据和目标标签按照指定的比例或数量随机划分为训练集和测试集。划分后的训练集和测试集分别存储在X_train
、X_test
、y_train
和y_test
中
import sklearn.model_selection as sk_model_selection
X_train,X_test,y_train,y_test = sk_model_selection.train_test_split(digitals_X,digitals_y,train_size=0.3,random_state=20)
下面是各个参数的解释:
-
digitals_X
:特征数据(例如,MNIST数据集中的图像数据)。 -
digitals_y
:目标标签(例如,MNIST数据集中的对应标签)。 -
train_size
:指定训练集的大小,可以是一个小数(表示比例)或一个整数(表示样本数量)。在这个例子中,训练集的大小为原始数据集的30%。 -
random_state
:随机数种子。它用于确定数据集划分的随机性。在这个例子中,使用随机种子20来确保结果的可重复性。
数据预处理
去除无用信息,错误信息,skleran中为我们提供了一个数据预处理的package:preprocessing,直接导入即可
import sklearn.preprocessing as sk_preprocessing
数据归一化
scaler = sk_preprocessing.StandardScaler().fit(X)
new_X = scaler.transform(X)
print('基于mean和std的标准化:',new_X)
scaler = sk_preprocessing.MinMaxScaler(feature_range=(0,1)).fit(X)
new_X=scaler.transform(X)
print('规范化到一定区间内',new_X)
数据正则化
首先求出样本的p-范数,然后该样本的所有元素都要除以该范数,这样最终使得每个样本的范数都为1
new_X = sk_preprocessing.normalize(X,norm='l2')
print('求二范数',new_X)
特征提取(可选)
提取有用信息,常用于降维(将对结果影响较小的维度舍去,保留对结果影响较大的维度)
常用方法有PCA和LDA两种方法:
-
PCA(主成分分析)
PCA的目标:新坐标系上数据的方差越大越好(最大方差理论:信号具有较大的方差,噪声具有较小的方差) PCA是无监督的学习方法,在sklearn中,直接使用skleran.decomposition即可
import sklearn.decomposition as sk_decomposition
pca = sk_decomposition.PCA(n_components='mle',whiten=False,svd_solver='auto')
pca.fit(iris_X)
reduced_X = pca.transform(iris_X) #reduced_X为降维后的数据
print('PCA:')
print ('降维后的各主成分的方差值占总方差值的比例',pca.explained_variance_ratio_)
print ('降维后的各主成分的方差值',pca.explained_variance_)
print ('降维后的特征数',pca.n_components_)
-
LDA(线性评价分析)
LDA的主要目标是通过最大化类间距离和最小化类内距离,将原始高维特征空间投影到一个较低维的新空间。在这个新空间中,样本点具有更好的类别可分性。LDA肯定是一个有监督算法,如下是skleran实现LDA。
import sklearn.discriminant_analysis as sk_discriminant_analysis
lda = sk_discriminant_analysis.LinearDiscriminantAnalysis(n_components=2)
lda.fit(iris_X,iris_y)
reduced_X = lda.transform(iris_X) #reduced_X为降维后的数据
print('LDA:')
print ('LDA的数据中心点:',lda.means_) #中心点
print ('LDA做分类时的正确率:',lda.score(X_test, y_test)) #score是指分类的正确率
print ('LDA降维后特征空间的类中心:',lda.scalings_) #降维后特征空间的类中心
二、跑模型
1. 训练及评估模型
-
直接使用SVM - 简易版
import sklearn.svm as sk_svm
model = sk_svm.SVC(C=1.0,kernel='rbf',gamma='auto')
#拟合模型
model.fit(X_train,y_train)
#为模型打分
acc=model.score(X_test,y_test) #根据给定数据与标签返回正确率的均值
print('SVM模型评价:',acc)
下面是各个参数的解释:
-
C
:SVM的惩罚参数(正则化参数),控制了分类器的错误容忍程度。较小的C值使模型更倾向于选择边界较大的间隔,可能导致更多的错误分类;较大的C值使模型更倾向于避免错误分类,但可能会导致边界较小的间隔。在这个例子中,C值设置为1.0。 -
kernel
:SVM的核函数,用于将输入数据映射到高维空间以便于分类。常见的核函数有线性核('linear')、高斯径向基核('rbf')等。在这个例子中,使用高斯径向基核。 -
gamma
:高斯径向基核函数的参数,控制每个训练样本对决策边界的影响。较小的gamma值意味着高斯核具有较大的范围,而较大的gamma值使得高斯核具有较小的范围。在这个例子中,设置为'auto',表示gamma的值将被自动计算。
-
优化SVM参数 - 优化版
sklearn.model_selection模块提供了一些常用的模型选择和评估工具,如交叉验证、网格搜索、评估指标等,可以用来选择最优的模型和调整模型参数,以及评估模型的性能。
from sklearn.model_selection import GridSearchCV
from sklearn import svm
# 定义模型和参数
parameters = {'kernel': ('linear', 'rbf'), 'C': [1, 10]}
svc = svm.SVC()
# 进行网格搜索
model = GridSearchCV(svc, parameters)
model.fit(digitals.data, digitals.target)
# 输出最优模型参数和得分
print(model.best_params_)
print(model.best_score_)
model.fit(X_train, y_train)
用训练集的特征数据X_train
和目标标签y_train
来训练SVM模型。model.score(X_test, y_test)
用测试集的特征数据X_test
和目标标签y_test
评估模型的性能。score
方法计算分类准确率,即在测试集上正确分类的样本比例。acc
变量存储了模型在测试集上的分类准确率,可以用于评估模型的性能。
2. 交叉验证(可选)
cross_val_score
函数返回每一折的性能指标,我们可以通过输出这些指标来查看每一折的得分。此外,使用mean()
函数计算这些得分的平均值,以获得模型的平均性能指标。
# 执行交叉验证并计算模型的性能指标
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, digitals_X, digitals_y, cv=5)
# 输出交叉验证的性能指标
print("交叉验证得分: ", scores)
print("平均准确率: ", scores.mean())
3. 模型的保存和载入
- 模型的保存和载入方便我们将训练好的模型保存在本地或发送在网上,载入模型方便我们在不同的环境下进行测试。 可以使用sklearn自带的函数
- 通过保存和加载模型,你可以在需要时重新加载模型,而无需重新训练,从而方便地进行预测、评估和部署模型。
joblib
是Python中一个常用的库,用于高效地保存和加载Python对象,尤其在科学计算和机器学习领域中非常受欢迎。它是scikit-learn库的一部分,主要用于模型持久化(即保存和加载训练好的模型)。
# 保存模型
joblib.dump(model, 'svm_model.pkl')
# 加载模型
loaded_model = joblib.load('svm_model.pkl')
# 使用加载的模型进行预测
predictions = loaded_model.predict(X_test)
# 看看预测结果
print(predictions)
三、完整代码
# 导入sklearn的数据集
import joblib
import sklearn.datasets as sk_datasets
digitals = sk_datasets.load_digits()
digitals_X = digitals.data #导入数据
digitals_y = digitals.target #导入标签
# 创建数据集
import sklearn.datasets._samples_generator as sk_sample_generator
X,y=sk_sample_generator.make_classification(n_samples=6,n_features=5,n_informative=2,n_redundant=3,n_classes=2,n_clusters_per_class=2,scale=1,random_state=20)
for x_,y_ in zip(X,y):
print(y_,end=": ")
print(x_)
# 数据集划分
import sklearn.model_selection as sk_model_selection
X_train,X_test,y_train,y_test = sk_model_selection.train_test_split(digitals_X,digitals_y,train_size=0.8,random_state=20)
# 数据预处理
import sklearn.preprocessing as sk_preprocessing
# 数据归一化
scaler = sk_preprocessing.StandardScaler().fit(X)
new_X = scaler.transform(X)
print('基于mean和std的标准化:',new_X)
scaler = sk_preprocessing.MinMaxScaler(feature_range=(0,1)).fit(X)
new_X=scaler.transform(X)
print('规范化到一定区间内',new_X)
# 数据正则化
new_X = sk_preprocessing.normalize(X,norm='l2')
print('求二范数',new_X)
# 简易版(二选一)
# 直接使用SVM模型
import sklearn.svm as sk_svm
model = sk_svm.SVC(C=1.0,kernel='rbf',gamma='auto')
# 拟合模型
model.fit(X_train,y_train)
# 为模型打分
acc=model.score(X_test,y_test) #根据给定数据与标签返回正确率的均值
print('SVM模型评价:',acc)
# 结果:0.494
# 优化版(二选一)
from sklearn.model_selection import GridSearchCV
from sklearn import svm
# 定义模型和参数
parameters = {'kernel': ('linear', 'rbf'), 'C': [1, 10]}
svc = svm.SVC()
# 进行网格搜索
model = GridSearchCV(svc, parameters)
model.fit(digitals.data, digitals.target)
# 输出最优模型参数和得分
print(model.best_params_)
print(model.best_score_)
# 结果:0.974
# 交叉验证(可选)
# 执行交叉验证并计算模型的性能指标
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, digitals_X, digitals_y, cv=5)
# 输出交叉验证的性能指标
print("交叉验证得分: ", scores)
print("平均准确率: ", scores.mean())
# 模型保存载入
# 保存模型
joblib.dump(model, 'svm_model.pkl')
# 加载模型
loaded_model = joblib.load('svm_model.pkl')
# 使用加载的模型进行预测
predictions = loaded_model.predict(X_test)
# 看看预测结果
print(predictions)