机器学习:回归、降维与聚类案例分析
1. 多元线性回归模型评估与选择
在机器学习中,评估回归模型的性能至关重要。Scikit - learn 提供了许多指标函数,用于评估估计器的预测效果,并帮助我们选择最适合特定研究的模型。
1.1 回归模型指标
-
决定系数($R^2$ 分数)
:$R^2$ 分数衡量了模型对数据的拟合程度,取值范围从 0.0 到 1.0,1.0 表示模型能完美预测因变量的值。可以使用
sklearn.metrics模块的r2_score函数计算,示例代码如下:
from sklearn import metrics
# 假设 expected 是预期结果数组,predicted 是预测结果数组
metrics.r2_score(expected, predicted)
-
均方误差(Mean Squared Error)
:均方误差通过计算每个预期值和预测值之间的差异,将这些差异平方后求平均值得到。可以使用
sklearn.metrics模块的mean_squared_error函数计算,示例代码如下:
metrics.mean_squared_error(expected, predicted)
在比较估计器时,均方误差越接近 0 的模型越适合数据。
1.2 选择最佳模型
为了确定哪种估计器在特定数据集上表现最佳,我们可以尝试多种估计器。以加利福尼亚住房数据集为例,我们使用已创建的
LinearRegression
估计器,以及
ElasticNet
、
Lasso
和
Ridge
回归估计器(均来自
sklearn.linear_model
模块)。
from sklearn.linear_model import ElasticNet, Lasso, Ridge
from sklearn.model_selection import KFold, cross_val_score
# 定义估计器字典
estimators = {
'LinearRegression': linear_regression,
'ElasticNet': ElasticNet(),
'Lasso': Lasso(),
'Ridge': Ridge()
}
# 使用 k - 折交叉验证评估每个估计器
for estimator_name, estimator_object in estimators.items():
kfold = KFold(n_splits = 10, random_state = 11, shuffle = True)
scores = cross_val_score(estimator = estimator_object,
X = california.data, y = california.target, cv = kfold,
scoring = 'r2')
print(f'{estimator_name:>16}: ' + f'mean of r2 scores={scores.mean():.3f}')
运行结果如下:
| 估计器名称 | $R^2$ 分数均值 |
| ---- | ---- |
| LinearRegression | 0.599 |
| ElasticNet | 0.423 |
| Lasso | 0.285 |
| Ridge | 0.599 |
从结果可以看出,
LinearRegression
和
Ridge
似乎是该数据集的最佳模型。
2. 无监督机器学习 - 降维
在数据科学中,了解数据是关键。无监督机器学习和可视化可以帮助我们发现未标记样本之间的模式和关系。当处理具有大量特征(即高维数据)的数据集时,可视化变得困难。此时,我们可以使用降维技术将数据减少到二维或三维,以便进行可视化分析。
2.1 加载数据集
以手写数字数据集为例,我们可以使用以下代码加载数据集:
from sklearn.datasets import load_digits
digits = load_digits()
2.2 创建 TSNE 估计器进行降维
我们使用
sklearn.manifold
模块的
TSNE
估计器,它使用 t - 分布随机邻域嵌入(t - SNE)算法分析数据集的特征并将其减少到指定的维度。
from sklearn.manifold import TSNE
tsne = TSNE(n_components = 2, random_state = 11)
2.3 将数据集特征转换为二维
降维通常涉及两个步骤:使用数据集训练估计器,然后使用估计器将数据转换为指定的维度。可以使用
fit_transform
方法一步完成:
reduced_data = tsne.fit_transform(digits.data)
运行后,可以通过检查
reduced_data
的形状来确认结果:
reduced_data.shape
结果为
(1797, 2)
,表示数据已成功降维到二维。
2.4 可视化降维后的数据
使用
Matplotlib
的
scatter
函数绘制散点图来展示降维后的数据:
import matplotlib.pyplot as plt
dots = plt.scatter(reduced_data[:, 0], reduced_data[:, 1], c = 'black')
此时,我们可以看到数据点形成了一些簇,但不清楚每个簇是否代表相同的数字。
2.5 根据已知目标值着色
为了确定这些簇是否确实代表特定数字,我们可以使用数据集中已知的目标值为点着色:
dots = plt.scatter(reduced_data[:, 0], reduced_data[:, 1],
c = digits.target, cmap = plt.cm.get_cmap('nipy_spectral_r', 10))
colorbar = plt.colorbar(dots)
通过这种方式,我们可以看到 10 个对应于数字 0 - 9 的簇,这表明监督学习方法(如 k - 近邻算法)可能适用于该数据。
3. 无监督机器学习 - k - 均值聚类
k - 均值聚类是一种简单的无监督机器学习算法,用于分析未标记样本并将其分组到相关的簇中。“k” 表示希望在数据上形成的簇的数量。
3.1 鸢尾花数据集介绍
鸢尾花数据集是一个经典的数据集,包含 150 个样本,每个样本有 4 个特征,描述了三种鸢尾花(Iris setosa、Iris versicolor 和 Iris virginica)的特征。虽然该数据集已标记,但我们将忽略这些标签来演示聚类过程,然后使用标签来评估 k - 均值算法的聚类效果。
3.2 加载鸢尾花数据集
from sklearn.datasets import load_iris
iris = load_iris()
# 打印数据集描述信息
print(iris.DESCR)
数据集的基本信息如下:
| 信息 | 详情 |
| ---- | ---- |
| 样本数量 | 150(每个类别 50 个) |
| 属性数量 | 4 个数值预测属性和类别 |
| 属性信息 | 萼片长度(cm)、萼片宽度(cm)、花瓣长度(cm)、花瓣宽度(cm) |
| 类别 | Iris - Setosa、Iris - Versicolour、Iris - Virginica |
我们可以通过以下代码确认样本数量、特征数量和目标数量:
print(iris.data.shape) # 样本数量和特征数量
print(iris.target.shape) # 目标数量
print(iris.target_names) # 目标名称
print(iris.feature_names) # 特征名称
3.3 使用 Pandas 探索鸢尾花数据集
import pandas as pd
# 设置 Pandas 选项
pd.set_option('max_columns', 5)
pd.set_option('display.width', None)
# 创建 DataFrame
iris_df = pd.DataFrame(iris.data, columns = iris.feature_names)
# 添加物种名称列
iris_df['species'] = [iris.target_names[i] for i in iris.target]
# 查看数据集前几行
print(iris_df.head())
通过以上步骤,我们完成了对回归模型的评估与选择、数据降维以及 k - 均值聚类的初步探索。在后续的分析中,我们可以进一步优化模型,深入挖掘数据中的信息。
下面是一个简单的 mermaid 流程图,展示了数据处理的主要步骤:
graph LR
A[加载数据集] --> B[回归模型评估与选择]
B --> C[降维处理]
C --> D[可视化降维数据]
A --> E[k - 均值聚类]
E --> F[探索数据集]
机器学习:回归、降维与聚类案例分析
4. k - 均值聚类算法原理与实现
k - 均值聚类算法是一种无监督学习方法,其核心目标是将未标记的样本划分为 k 个不同的簇。以下是该算法的详细步骤:
- 初始化质心 :从数据集中随机选择 k 个样本作为初始质心。
- 分配样本 :计算每个样本到各个质心的距离,将样本分配到距离最近的质心所在的簇。
- 更新质心 :重新计算每个簇的质心,即该簇内所有样本的均值。
- 重复步骤 2 和 3 :不断迭代,直到质心不再发生显著变化或达到最大迭代次数。
以下是使用 Scikit - learn 实现 k - 均值聚类的代码:
from sklearn.cluster import KMeans
# 创建 KMeans 对象,指定簇的数量为 3
kmeans = KMeans(n_clusters = 3, random_state = 11)
# 对鸢尾花数据集进行聚类
kmeans.fit(iris.data)
5. 评估 k - 均值聚类结果
为了评估 k - 均值聚类的效果,我们可以将聚类结果与数据集中已知的标签进行比较。以下是具体的评估步骤:
-
获取聚类标签
:使用
kmeans.labels_获取每个样本的聚类标签。 -
创建混淆矩阵
:使用
sklearn.metrics模块的confusion_matrix函数创建混淆矩阵,以查看聚类结果与真实标签的匹配情况。
from sklearn.metrics import confusion_matrix
# 获取聚类标签
labels = kmeans.labels_
# 创建混淆矩阵
conf_matrix = confusion_matrix(iris.target, labels)
print(conf_matrix)
通过混淆矩阵,我们可以直观地看到聚类结果与真实标签之间的差异。以下是一个简单的表格展示混淆矩阵的一般形式:
| | 簇 0 | 簇 1 | 簇 2 |
| ---- | ---- | ---- | ---- |
| 类别 0 | a | b | c |
| 类别 1 | d | e | f |
| 类别 2 | g | h | i |
其中,矩阵中的元素表示属于某个真实类别且被聚类到某个簇的样本数量。
6. 优化 k - 均值聚类
在实际应用中,我们可以通过调整 k - 均值聚类的参数来优化聚类效果。以下是一些常见的优化方法:
- 选择合适的 k 值 :可以使用肘部法则(Elbow Method)来选择最优的 k 值。肘部法则通过计算不同 k 值下的簇内误差平方和(SSE),选择 SSE 下降速度突然变缓的点作为最优 k 值。
- 多次运行算法 :由于 k - 均值聚类的初始质心是随机选择的,多次运行算法并选择最优的聚类结果可以提高稳定性。
以下是使用肘部法则选择 k 值的代码示例:
import matplotlib.pyplot as plt
# 计算不同 k 值下的 SSE
sse = []
for k in range(1, 11):
kmeans = KMeans(n_clusters = k, random_state = 11)
kmeans.fit(iris.data)
sse.append(kmeans.inertia_)
# 绘制 SSE 曲线
plt.plot(range(1, 11), sse, marker = 'o')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Sum of squared errors (SSE)')
plt.show()
通过观察 SSE 曲线,我们可以找到肘部点,从而确定最优的 k 值。
7. 总结与展望
通过以上案例分析,我们学习了如何使用多元线性回归模型进行预测,并通过评估指标选择最佳模型;掌握了降维技术,将高维数据降维到二维以便可视化分析;还了解了 k - 均值聚类算法,对未标记数据进行聚类分析。
在未来的数据分析中,我们可以进一步探索其他机器学习算法,如决策树、支持向量机等,以应对更复杂的问题。同时,结合深度学习技术,如神经网络,可能会取得更好的预测和聚类效果。
以下是一个 mermaid 流程图,展示了 k - 均值聚类的主要步骤:
graph LR
A[初始化质心] --> B[分配样本到最近质心]
B --> C[更新质心]
C --> D{是否收敛?}
D -- 否 --> B
D -- 是 --> E[输出聚类结果]
通过这些方法和技术,我们可以更好地理解和处理数据,为实际应用提供有力的支持。
超级会员免费看

被折叠的 条评论
为什么被折叠?



