一、 距离计算方法
在机器学习中,距离计算是一个非常重要的概念,它用于衡量样本之间的相似性。常见的距离计算方法有以下几种:
-
欧式距离:两个样本间所有维度差的平方和再开方。公式表示为:对于两个样本 x = ( x 1 , x 2 , ⋯ , x n ) x=(x_1,x_2,\cdots,x_n) x=(x1,x2,⋯,xn) 和 y = ( y 1 , y 2 , ⋯ , y n ) y=(y_1,y_2,\cdots,y_n) y=(y1,y2,⋯,yn),欧式距离 d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x,y)=\sqrt{\sum_{i = 1}^{n}(x_i - y_i)^2} d(x,y)=∑i=1n(xi−yi)2。
-
曼哈顿距离:两个样本间所有维度差的绝对值相加。公式为: d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x,y)=\sum_{i = 1}^{n}|x_i - y_i| d(x,y)=∑i=1n∣xi−yi∣。
-
切比雪夫距离:两个样本间所有维度差的最大值。即 d ( x , y ) = max i = 1 n ∣ x i − y i ∣ d(x,y)=\max_{i = 1}^{n}|x_i - y_i| d(x,y)=maxi=1n∣xi−yi∣。
二、 归一化和标准化
在处理数据时,为了让机器学习算法效果更好,常常需要对数据进行预处理。常见的预处理方法有归一化和标准化。
-
2.1 归一化:
-
方法:导入
sklearn.preprocessing
里的MinMaxScaler
,创建归一化对象,分别对x_train
和x_test
使用fit_transform
和transform
。 -
作用:通过对原始数据进行变换把数据映射到【mi,mx】(默认为 [0,1]) 之间。
-
公式: X scaled = X − X min X max − X min X_{\text{scaled}} = \frac{X - X_{\text{min}}}{X_{\text{max}} - X_{\text{min}}} Xscaled=Xmax−XminX−Xmin
其中, X min X_{\text{min}} Xmin和 X max X_{\text{max}} Xmax分别为特征的最小值和最大值。
-
适用场景:适用于数据分布不呈正态、存在明显边界或对输入范围敏感的场景。
-
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_train
和x_test
使用fit_transform
和transform
。 -
作用:通过对原始数据进行标准化,转换为均值为 0 标准差为 1 的标准正态分布的数据。
-
公式: X scaled = X − μ σ X_{\text{scaled}} = \frac{X - \mu}{\sigma} Xscaled=σX−μ
其中, μ \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_)