别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

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

 

 

posted @ 2024-04-25 08:59  一路狂奔的乌龟  阅读(92)  评论(0)    收藏  举报
返回顶部