人工智能概念之一:机器学习基础概念(距离计算方法、归一化和标准化、交叉验证和网格搜索)

80 阅读2分钟

一、 距离计算方法

在机器学习中,距离计算是一个非常重要的概念,它用于衡量样本之间的相似性。常见的距离计算方法有以下几种:

  • 欧式距离:两个样本间所有维度差的平方和再开方。公式表示为:对于两个样本 x=(x1,x2,,xn)x=(x_1,x_2,\cdots,x_n)y=(y1,y2,,yn)y=(y_1,y_2,\cdots,y_n),欧式距离 d(x,y)=i=1n(xiyi)2d(x,y)=\sqrt{\sum_{i = 1}^{n}(x_i - y_i)^2}

  • 曼哈顿距离:两个样本间所有维度差的绝对值相加。公式为:d(x,y)=i=1nxiyid(x,y)=\sum_{i = 1}^{n}|x_i - y_i|

  • 切比雪夫距离:两个样本间所有维度差的最大值。即 d(x,y)=maxi=1nxiyid(x,y)=\max_{i = 1}^{n}|x_i - y_i|

二、 归一化和标准化

在处理数据时,为了让机器学习算法效果更好,常常需要对数据进行预处理。常见的预处理方法有归一化和标准化。

  • 2.1 归一化

    • 方法:导入sklearn.preprocessing里的MinMaxScaler,创建归一化对象,分别对x_trainx_test使用fit_transformtransform

    • 作用:通过对原始数据进行变换把数据映射到【mi,mx】(默认为 [0,1]) 之间。

    • 公式Xscaled=XXminXmaxXminX_{\text{scaled}} = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}}

      其中,XminX_{\text{min}}XmaxX_{\text{max}}分别为特征的最小值和最大值。

    • 适用场景:适用于数据分布不呈正态、存在明显边界或对输入范围敏感的场景。

from sklearn.preprocessing import MinMaxScaler
import numpy as np

# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6]])
scaler = MinMaxScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)
  • 2.2 标准化

    • 方法:导入sklearn.preprocessing里的StandardScaler,创建标准化对象,分别对x_trainx_test使用fit_transformtransform

    • 作用:通过对原始数据进行标准化,转换为均值为 0 标准差为 1 的标准正态分布的数据。

    • 公式Xscaled=XμσX_{\text{scaled}} = \frac{X - \mu}{\sigma}

      其中,μ\mu为特征的均值,σ\sigma为特征的标准差。

    • 适用场景:适用于数据分布接近正态分布或存在离群点的场景。

from sklearn.preprocessing import StandardScaler
import numpy as np

# 示例数据
X = np.array([[1, 2], [3, 4], [5, 6]])
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(X_scaled)

三、 交叉验证和网格搜索

  • 交叉验证:是划分数据集的一种方法,目的是为了得到更加准确可信的模型评分,评估模型在未知数据上的表现,避免一次划分数据造成的偶然性。

  • 网格搜索:能够自动寻找最优的超参数组合,它枚举所有指定的超参数组合,并返回验证得到的最优组合。两者结合形成一个模型参数调优的解决方案,用于模型开发阶段的调参优化,提高泛化能力。

from sklearn.model_selection import GridSearchCV, cross_val_score​
from sklearn.neighbors import KNeighborsClassifier​
from sklearn.datasets import load_iris​
import numpy as np​
​
# 加载数据集​
iris = load_iris()​
X = iris.data​
y = iris.target​
​
# 定义参数网格​
param_grid = {'n_neighbors': np.arange(1, 20)}​
​
# 创建KNN分类器​
knn = KNeighborsClassifier()​
​
# 创建网格搜索对象​
grid_search = GridSearchCV(knn, param_grid, cv=5)​
​
# 进行网格搜索​
grid_search.fit(X, y)​
​
# 输出最优参数​
print("Best parameters: ", grid_search.best_params_)