- 数据集:数据集?样本?特征值?标签?
- 分类任务:
- 二分类
- 多分类:数字识别,图像识别
-
回归任务:连续的值,而非一个类别
- 监督学习:
- 有了答案,有标签
- 非监督学习
- 对没有标记的数据进行分类-聚类分析
- 意义:数据降维(方便可视化,异常检测): 特征提取:提取有意义的特征、特征压缩:PCA
- 半监督学习:
- 一部分数据有标记、答案,一部分没有
- 通常先使用无监督分出标签,然后使用监督学习
- 增强学习
- 无人驾驶
- 机器人
- 批量学习
- 优点:简单;问题:如何适应环境变化,解决:定时重写批量学习,缺点:每次重新批量运算量巨大,实时性强的无法应用
- 在线学习
- 优点:机试反映新的环境变化, 缺点:新的数据有问题; 解决:加强数据监控
- 也适用于数据量巨大
- 参数学习
- 一旦学到了参数,就不需要原有的数据集
- 非参数学习
- 不对模型进行过多的假设
- 非参数不等于没有参数
对具体的问题,需要尝试多种算法比较出较好的算法
k近邻算法
- 距离:
- 欧拉距离:
- 曼哈顿距离
- 超参数和模型参数
- 超参数:在算法运行前需要决定的参数
- 模型参数:算法过程中学习的参数
- KNN没有模型参数,k是典型的超参数
- 寻找好的超参数:
- 领域知识,经验数值(默认数值),实验搜索
- 数据归一化
- 最值归一化
normalization
:所有数据映射在0-1之间,分布有明显的边界比如成绩边界在0-100,但是如果没有边界的数据有较大影响 - 均值方差归一化
standardization
:数据分布没有明显边界,可能存在极端值,
- 最值归一化
- 如何数据归一化
- 测试集和训练集使用的均值和方差 都是训练集的
- 缺点:
- 处理量大
- 高度数据相关
- 预测结果不具有课解释性
- 维数灾难:随着维度的增加,‘看似相近’的两个点之间的距离越来越大
- 流程
- 训练数据/测试数据 -> 归一化 -> 模型(网格搜索寻最优超参数) -> 训练 -> 精确度
- 代码:
from sklearn import datasets # 导入数据集
from sklearn.model_selection import train_test_split # 测试集和训练集的划分
from sklearn.preprocessing import StandardScaler # 传入均值方差方法
from sklearn.model_selection import GridSearchCV # 超网格搜索
from sklearn.neighbors import KNeighborsClassifier # k近邻算法
from sklearn.metrics import accuracy_score # 估计方法
# 数据加载分割预处理
iris = datasets.load_iris()
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=666)
# 数据归一化处理
standardScaler = StandardScaler() # 实例化
standardScaler.fit(x_train) # 根据训练集算出均值和方差
standardScaler.mean_ # 每一列的均值
standardScaler.scale_ # 每一列的方差
x_train = standardScaler.transform(x_train) # 转换训练集归一化处理
x_test = standardScaler.transform(x_test) # 转化测试机归一化处理
# 超网格搜索最佳参数
param_grid = [
{
'weights':['uniform'], # 距离统一不加权
'n_neighbors': [i for i in range(1, 11)] # 邻居数量n
},
{
'weights':['distance'], # 距离加权
'n_neighbors': [i for i in range(1, 11)], #
'p':[i for i in range(1, 6)] # 明科夫斯基公式的p次方
}
] # 定义参数字典型列表
grid_search = GridSearchCV(knn_clf, param_grid, n_jobs=-1, verbose=2) # 实例化超网格搜索,传入模型、参数、CPU调动核数、详情显示
grid_search.fit(x_train, y_train) # 进行训练
grid_search.best_estimator_ # 最佳的参数
grid_search.best_score_ # 根据交叉验证得出的最佳预测结果
knn_clf = KNeighborsClassifier(n_neighbors=5, weights='uniform', p=2)
knn_clf.fit(x_train, y_train)
knn_clf.score(x_test, y_test)
y_predict = knn_clf.predict(x_test)
accuracy_score(y_test,y_predict)