Python数据分析-机器学习Scikit-Learn
1. 简介
Python提供的第三方模块Scikit-Learn融入了大量的数学模型算法,使得数据分析、机器学习变得简单高效。
Scikit-Learn(简称Sklearn)是Python的第三方模块,它是机器学习领域中知名的Python模块之一,它对常用的机器学习算法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)和聚类(Clustering)四大机器学习算法。
Scikit-Learn特点:
- 简单高效的数据挖掘和数据分析工具。
- 让每个人能够在复杂环境中重复使用。
- Scikit-Learn是Scipy模块的扩展,是建立在NumPy和Matplotlib模块的基础上的。
- 开源,采用BSD协议,可用于商业。
2. 线性模型
Scikit-Learn已经设计了(sklearn.linear_model),在程序中直接调用即可,无须编写过多代码就可以轻松实现线性回归分析。
在Python中,无须理会烦琐的线性回归求解数学过程,直接使用Scikit-Learn的linear_model模块就可以实现线性回归分析。linear_model模块提供了很多线性模型,包括最小二乘法回归、岭回归、Lasso、贝叶斯回归等。
岭回归是在最小二乘法回归基础上,加入了对表示回归系数的L2范数约束。岭回归是缩减法的一种,相当于对回归系数的大小施加了限制。
2.1. 最小二乘法回归
1 from sklearn import linear_model 2 import numpy as np 3 4 x = np.array([[1, 56], [2, 104], [3, 156], [4, 200], [5, 250], [6, 300]]) 5 y = np.array([7800, 9000, 9200, 10000, 11000, 12000]) 6 clf = linear_model.LinearRegression() 7 clf.fit(x, y) # 拟合线性模型 8 k = clf.coef_ # 回归系数 9 b = clf.intercept_ # 截距 10 x0 = np.array([[7, 170]]) 11 # 通过给定的x0预测y0,y0=截距+X值*回归系数 12 y0 = clf.predict(x0) # 预测值 13 print('回归系数:', k) 14 print('截距:', b) 15 print('预测值:', y0) 16 17 # 结果 18 # 回归系数: [1853.37423313 -21.7791411 ] 19 # 截距: 7215.950920245397 20 # 预测值: [16487.11656442]
2.2. 岭回归
1 from sklearn.linear_model import Ridge 2 import numpy as np 3 4 x = np.array([[1, 56], [2, 104], [3, 156], [4, 200], [5, 250], [6, 300]]) 5 y = np.array([7800, 9000, 9200, 10000, 11000, 12000]) 6 clf = Ridge(alpha=1.0) 7 clf.fit(x, y) 8 k = clf.coef_ # 回归系数 9 b = clf.intercept_ # 截距 10 x0 = np.array([[7, 170]]) 11 # 通过给定的x0预测y0,y0=截距+X值*斜率 12 y0 = clf.predict(x0) # 预测值 13 print('回归系数:', k) 14 print('截距:', b) 15 print('预测值:', y0) 16 17 # 结果 18 # 回归系数: [10.00932795 16.11613094] 19 # 截距: 6935.001421210872 20 # 预测值: [9744.80897725]
3. 支持向量机(SVM)
[参考:腾讯云,侵权联系删除]
支持向量机(SVM)可用于监督学习算法,主要包括分类、回归和异常检测。支持向量分类的方法可以被扩展用作解决回归问题,这个方法被称作支持向量回归。
3.1. 基本原理
找到一个超平面,使得不同类别的样本点在该超平面上的投影尽可能远离。SVM在高维空间中找到一个最优的超平面,从而实现对样本的有效分类。
3.2. 核函数
核函数用于将原始特征空间映射到更高维的空间,使得样本在新的空间中更容易分离。常用的核函数包括线性核、多项式核、高斯核等。
3.3. 超参数调优
SVM中的超参数包括惩罚项系数C、核函数的参数、软间隔与硬间隔的参数等。通过交叉验证等方法进行超参数的选择与调优是SVM模型优化的重要步骤。
3.4. 软间隔与硬间隔
硬间隔SVM要求训练数据是线性可分的,对噪声敏感;而软间隔SVM允许一定程度上的分类错误,提高了模型的泛化能力。
3.5. 优缺点
SVM的优点包括在高维空间中表现出色、对小样本集表现好、能够处理非线性问题。缺点主要在于对大规模数据集的计算开销较大,对参数和核函数的选择较为敏感。
3.6. 代码
示例1:
1 from sklearn.svm import LinearSVR # 导入线性回归类 2 from sklearn.datasets import load_boston # 导入加载波士顿数据集 3 from pandas import DataFrame # 导入DataFrame 4 5 boston = load_boston() # 创建加载波士顿数据对象 6 # 将波士顿房价数据创建为DataFrame对象 7 df = DataFrame(boston.data, columns=boston.feature_names) 8 df.insert(0, 'target', boston.target) # 将价格添加至DataFrame对象中 9 data_mean = df.mean() # 获取平均值 10 data_std = df.std() # 获取标准偏差 11 data_train = (df - data_mean) / data_std # 数据标准化 12 x_train = data_train[boston.feature_names].values # 特征数据 13 y_train = data_train['target'].values # 目标数据 14 linearsvr = LinearSVR(C=0.1) # 创建LinearSVR()对象 15 linearsvr.fit(x_train, y_train) # 训练模型 16 # 预测,并还原结果 17 x = ((df[boston.feature_names] - data_mean[boston.feature_names]) / data_std[boston.feature_names]).values 18 # 添加预测房价的信息列 19 df[u'y_pred'] = linearsvr.predict(x) * data_std['target'] + data_mean['target'] 20 print(df[['target', 'y_pred']].head()) # 输出真实价格与预测价格
实例2:
1 from sklearn import datasets 2 from sklearn.model_selection import train_test_split 3 from sklearn.svm import SVC 4 from sklearn import metrics 5 6 # 加载鸢尾花数据集 7 iris = datasets.load_iris() 8 X = iris.data 9 y = iris.target 10 11 # 将数据集划分为训练集和测试集 12 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) 13 14 # 构建SVM分类器 15 svm_classifier = SVC(kernel='linear', C=1) 16 # 'linear' 表示线性核函数,C是惩罚项系数 17 18 # 在训练集上训练模型 19 svm_classifier.fit(X_train, y_train) 20 21 # 在测试集上进行预测 22 y_pred = svm_classifier.predict(X_test) 23 24 # 计算准确率 25 accuracy = metrics.accuracy_score(y_test, y_pred) 26 print(f'准确率:{accuracy}')
4. 聚类
[参考资料:K-means聚类算法原理及python实现]
对于"监督学习"(supervised learning),其训练样本是带有标记信息的,并且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。
而在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的,目标是通过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。对于无监督学习,应用最广的便是"聚类"(clustering)。
"聚类算法"试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster),通过这样的划分,每个簇可能对应于一些潜在的概念或类别。
示例1:调用KMeans方法实现聚类:
1 import numpy as np 2 from sklearn.cluster import KMeans 3 4 X = np.array([[1, 10], [1, 11], [1, 12], [3, 20], [3, 23], [3, 21], [3, 25]]) 5 kmodel = KMeans(n_clusters=2) # 调用KMeans方法实现聚类(两类) 6 y_pred = kmodel.fit_predict(X) # 预测类别 7 print('预测类别:', y_pred) 8 print('分类簇的均值向量:', '\n', kmodel.cluster_centers_) 9 print('类别标记:', kmodel.labels_)
示例2:
1 from sklearn.datasets import make_blobs 2 import matplotlib.pyplot as plt 3 4 x, y = make_blobs(n_samples=500, n_features=2, centers=3) 5 6 from sklearn.cluster import KMeans 7 8 y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(x) 9 plt.scatter(x[:, 0], x[:, 1], c=y_pred) 10 plt.show()
示例3:
1 from sklearn.datasets import make_blobs 2 import matplotlib.pyplot as plt 3 4 x, y = make_blobs(n_samples=500, n_features=2, centers=3) 5 6 from sklearn.cluster import KMeans 7 8 y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(x) 9 plt.scatter(x[:, 0], x[:, 1], c=y_pred) 10 plt.show()
参考资料:
- 官网:https://scikit-learn.org/stable/
- CSDN:https://cloud.tencent.com/developer/article/2371915
- 腾讯云:https://cloud.tencent.com/developer/article/2371915
时间:2024年4月25日

Python数据分析-机器学习Scikit-Learn
浙公网安备 33010602011771号