机器学习实训(2)——分类(补充)

本文介绍了如何构建KNN分类器处理MNIST数据集,达到超过97%的测试精度。讲解了np.random.permutation()、KNeighborsClassifier和GridSearchCV的使用。接着,通过Kaggle上的Titanic数据集,演示了数据预处理过程,包括数据下载、缺失值处理和特征选择,最后展示了如何使用RandomForestClassifier提高模型准确率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1 构建分类器

1.1 np.random.permutation()

1.2 KNeighborsClassifier()

1.3 GridSearchCV() 

2 数据处理

2.1 Kaggle注册

2.2 Titanic数据处理


1 构建分类器

为MNIST数据集构建一个分类器,并在测试集上达成超过97%的精度。

下面进行代码展示:

#1、获取MNIST数据集
from sklearn.datasets import fetch_openml
mnist = fetch_openml('mnist_784', version=1, cache=True, as_frame=False)

#2、划分数据集
import numpy as np

X, y = mnist["data"], mnist["target"]

#MNIST默认划分的训练集和测试集
X_train, X_test, y_train, y_test = X[:60000], X[60000:], y[:60000], y[60000:] 

#数据重新洗牌,防止算法对训练实例的顺序敏感
shuffle_index = np.random.permutation(60000)#生成一个随机排列的数组
X_train, y_train = X_train[shuffle_index], y_train[shuffle_index]


#注意对自己电脑硬件不自信不要运行下面代码,以防蓝屏,可以了解一下思想
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

param_grid = [{'weights': ["uniform", "distance"], 'n_neighbors': [3, 4, 5]}]

knn_clf = KNeighborsClassifier()
grid_search = GridSearchCV(knn_clf, param_grid, cv=5, verbose=3, n_jobs=-1)
grid_search.fit(X_train, y_train)

找到合适的超参数: 

grid_search.best_params_

运行结果如下:

{'n_neighbors': 4, 'weights': 'distance'}

得分: 

grid_search.best_score_

运行结果如下:

0.97325

预测精度: 

from sklearn.metrics import accuracy_score

y_pred = grid_search.predict(X_test)
accuracy_score(y_test, y_pred)

运行结果如下:

0.9714

我们就代码中包含的知识点进行简单讲解:

1.1 np.random.permutation()

对给定的数组重新排列。

import numpy as np

arr = np.random.permutation(6)
print(arr)

运行结果如下:

[2 5 4 0 3 1]

另外对数组进行重新排列的还包括:np.random.shuffle(arr)

arr = np.arange(6)
print(arr)
np.random.shuffle(arr)
print(arr)

运行结果如下:

[0 1 2 3 4 5]
[4 5 1 2 0 3]

1.2 KNeighborsClassifier()

中文文档说明:sklearn.neighbors.KNeighborsClassifier-scikit-learn中文社区

英文文档说明:sklearn.neighbors.KNeighborsClassifier — scikit-learn 1.1.2 documentation 

我们看一下文档中参数:

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30, p=2, metric='minkowski', metric_params=None, n_jobs=None, **kwargs)
参数 说明
n_neighbors int, default=5
默认情况下用于kneighbors查询的近邻数
weights {‘uniform’, ‘distance’} or callable, default=’uniform’
预测中使用的权重函数。 可能的值:
“uniform”:统一权重。 每个邻域中的所有点均被加权。
“distance”:权重点与其距离的倒数。 在这种情况下,查询点的近邻比远处的近邻具有更大的影响力。
[callable]:用户定义的函数,该函数接受距离数组,并返回包含权重的相同形状的数组。
algorithm {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’
用于计算最近临近点的算法:
“ ball_tree”将使用BallTree
kd_tree”将使用KDTree
“brute”将使用暴力搜索。
“auto”将尝试根据传递给fit方法的值来决定最合适的算法。
注意:在稀疏输入上进行拟合将使用蛮力覆盖此参数的设置。
leaf_size int, default=30
叶大小传递给BallTree或KDTree。 这会影响构造和查询的速度,以及存储树所需的内存。 最佳值取决于问题的性质。
p int, default=2
Minkowski指标的功率参数。 当p = 1时,这等效于对p = 2使用manhattan_distance(l1)和euclidean_distance(l2)。对于任意p,使用minkowski_distance(l_p)。
metric str or callable, default=’minkowski’
树使用的距离度量。 默认度量标准为minkowski,p = 2等于标准欧几里德度量标准。 有关可用度量的列表,请参见DistanceMetric的文档。 如果度量是“预先计算的”,则X被假定为距离矩阵,并且在拟合过程中必须为平方。 X可能是一个稀疏图,在这种情况下,只有“非零”元素可以被视为临近点。
metric_params dict, default=None
度量功能的其他关键字参数。
n_jobs int, default=None
为临近点搜索运行的并行作业数。 除非在joblib.parallel_backend上下文中,否则None表示1。 -1表示使用所有处理器。 有关更多详细信息,请参见
### 小样本学习与数据增强的概念 小样本学习是指在有限的数据集上训练机器学习模型的技术[^1]。传统机器学习依赖于大规模标注数据,但在许多应用场景中获取大量高质量的标注数据既昂贵又耗时。因此,探索如何利用少量样本来构建高效的学习算法成为一个重要课题。 对于数值型特征而言,可以通过各种变换操作来进行数据扩充,比如加噪声、缩放和平移等处理方式来生成新的观测值;而对于图像类别,则可采用旋转、翻转以及裁剪等方式实现相同目的[^3]。 ### 基于不同策略的小样本学习方法 #### 模型微调 这种方法主要针对预训练好的大型网络,在新任务上的特定领域内继续优化参数权重。通过冻结部分层或全部解冻的方式调整最后一两层全连接层甚至整个架构以适应目标任务需求。这种方式不仅减少了重新训练所需时间成本还继承了源域丰富的语义信息从而加速收敛过程提高性能表现[^2]。 #### 数据增强 为了克服因样本数量不足而导致泛化能力差的问题,可以采取一系列手段对原始输入空间施加随机扰动进而创造出更多变体形式供后续阶段使用。具体来说分为两大类: - **基于无标签数据**:当存在未标记实例资源时,可通过聚类分析找出相似簇并将它们视为同一类别成员进行自我监督式的半监督框架设计; - **基于合成/特征层面的操作**:前者指借助GANs或其他生成对抗机制模拟真实分布特性制造假象素材补充现有集合规模;后者则是提取高层抽象表示后再组合重构得到全新个体。 #### 迁移学习 迁移学习旨在解决目标领域缺乏足够多有效样本用于直接建模这一困境。其核心思想是从其他相关联的任务中学得的知识迁移到当前待解决问题上来辅助决策制定流程。按照转移对象的不同可分为以下几种情形: - **度量学习**:定义距离函数衡量两个实体之间的差异程度以便分类器能更精准地区分正负样本边界; - **元学习(Learning to Learn)**:即学会如何去学的新范式,强调快速适应未知环境的能力培养而非固定不变的一套规则体系; - **图神经网络**:适用于关系结构化的场景下节点间相互作用模式挖掘,如社交推荐系统里好友间的影响力传播路径探寻等问题。 ### 实际案例展示 假设现在有一个医疗影像识别项目,但是只有几百张病理切片图片可用作训练用途。此时就可以考虑引入上述提到的一些技巧来改善最终成果质量: ```python import torchvision.transforms as transforms from torch.utils.data import DataLoader, Dataset class CustomImageDataset(Dataset): def __init__(self, image_paths, labels=None, transform=None): self.image_paths = image_paths self.labels = labels self.transform = transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img_path = self.image_paths[idx] label = None if self.labels is None else self.labels[idx] # Load and apply transformations on the fly during iteration. sample = {'image': Image.open(img_path), 'label': label} if self.transform: sample['image'] = self.transform(sample['image']) return sample data_transform = transforms.Compose([ transforms.RandomHorizontalFlip(), transforms.ColorJitter(brightness=0.5), transforms.ToTensor() ]) train_dataset = CustomImageDataset(image_paths=train_image_files, labels=train_labels, transform=data_transform) dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True) # Fine-tuning a pre-trained model like ResNet or EfficientNet... pretrained_model = models.resnet50(pretrained=True).to(device) for param in pretrained_model.parameters(): param.requires_grad_(False) # Freeze all layers initially. fc_in_features = pretrained_model.fc.in_features pretrained_model.fc = nn.Linear(fc_in_features, num_classes).to(device) optimizer = optim.Adam(filter(lambda p: p.requires_grad, pretrained_model.parameters()), lr=learning_rate) ``` 这段代码展示了如何创建自定义数据加载器,并对其执行在线转换以增加多样性。接着是对预先训练过的卷积基底实施细粒度调节的过程概述——先锁定住大部分权值防止更新再单独放开最后几层参与反向传播计算直至找到最优解为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值