【机器学习 - 2】:数据集的处理

训练集和数据集分离


训练集和数据集分离的原理:当我们获取一个数据集时,我们需要将其一小部分拿出来作为测试集,剩余的作为训练集。例如对于一个训练集,将其20%作为测试集,80%作为训练集,这20%的测试集是已经有目标值了的,将训练集进行拟合,获得模型,再通过测试集进行测试,获得最终结果,将最终结果和已知的目标值进行比对,可预测其训练模型的精确度。
在这里插入图片描述
以下使用sklearn中的knn算法进行预测,以识别鸢尾花为例。

  • 先获取数据集,观察下图中y的值,可将0,1,2分别看做鸢尾花的不同种类。
from sklearn.datasets import load_iris
# 获取数据集
iris = load_iris()
X = iris.data
y = iris.target

在这里插入图片描述

  • 由上图可看出数据集的目标值是有一定顺序的,我们需要将其打乱后再分出训练集和测试集,打乱用到的函数为np.random.permutation(),下图中shuffle_indexs里是0-150的随机索引
import numpy as np
shuffle_indexs = np.random.permutation(len(X))

在这里插入图片描述

  • 打乱数据后开始取训练集和测试集,训练集取80%,测试集取20%
test_ratio = 0.2 # 取20%做测试集
test_size = int(len(X) * test_ratio)

test_indexs = shuffle_indexs[:test_size] # 测试集索引
train_indexs = shuffle_indexs[test_size:] # 训练集索引

# 获得训练集
X_train = X[train_indexs]
y_train = y[train_indexs]
# 获得测试集
X_test = X[test_indexs]
y_test = y[test_indexs]
  • 调用sklearn中的knn算法,将训练集进行拟合,获得模型,测试集通过训练的模型,获得最终的预测结果,观察下图可看到y_predict和y_test(标准答案),大部分是相同的。
from sklearn.neighbors import KNeighborsClassifier
knn_clf = KNeighborsClassifier()
knn_clf.fit(X_train, y_train)	# 拟合,获得模型

y_predict = knn_clf.predict(X_test)	# 获取测试集的最终结果

在这里插入图片描述

  • 根据y_predict和y_test,计算出模型的准确度,每次运行获得的准确度都不一样,但是准确率都在90%以上,说明模型的准确度较高。
np.sum(np.array(y_predict == y_test, dtype='int'))/len(y_test)

在这里插入图片描述

获取最优模型


参数的不同,会导致模型的不同,从而我们需要找到最合适的参数,从而训练出最优的模型。

我们可以自定义一个train_test_split函数,获取到训练集和测试集数据。根据以上的代码,编写的函数如下:

import numpy as np
def train_test_split(X, y, test_ratio=0.2, random_state=None):
    if random_state:
        np.random.seed(random_state) # 设置随机种子
    shuffle_indexs = np.random.permutation(len(X))
    test_ration = test_ration
    test_size = int(len(X) * test_ratio)
    
    test_indexs = shffle_indexs[:test_size]
    train_indexs = shuffle_indexs[test_size:]
    
    # 训练集
    X_train = X[train_indexs]
    y_train = y[train_indexs]
    
    # 测试集
    X_test = X[test_indexs]
    y_test = y[test_indexs]
    
    return X_train, X_test, y_train, y_test

我们也可以使用sklearn中封装好的train_test_split

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

在这里插入图片描述

超参数

超参数:在执行程序之前需要确定的参数。

举个例子:在knn分类器中,即KNeighborsClassifier(n_neighbors=3),n_neighbors值的不同,会导致模型的准确率不同,我们需要不断调整参数,找到某个数更加拟合我们的数据,这就是超参数

权重问题:在【机器学习 - 1】:knn算法这一篇文章里,我们举了一个使用knn算法判断肿瘤为恶性肿瘤或良性肿瘤的例子,这个例子中我们主要以离待预测点周围最近的3个点进行判断。
而在如下图的情况中,待预测点(绿点)离红点(良性肿瘤)比较近,则它更可能为良性肿瘤,若以上篇文章中的思路来判断,因为它周围有2两个恶性肿瘤(蓝点),所以它很可能为恶性肿瘤。根据以上两种判断情况,我们需要把距离个数这两种判断特征都考虑进来。

即绿色的点离红色的点最近,我们可以给这些距离加一个权重,这样及时周围有两个蓝点,但红点最近的距离权重大于这两个蓝点的距离权重,绿色的点可能就为良性肿瘤
在这里插入图片描述
在KNeighborsClassifier()中可设置权重参数:weights
weights=uniform时,不考虑距离带来的权重问题
weights=distance时,距离作为计算的权重

我们先看一下KNeighborsClassifier()的源码(如下图2),weights默认为uniform,p=2这个p是距离方法(如下图1),当=1时为曼哈顿距离,p=2时为欧拉距离,p增大,计算距离的方法不同。在KNeighborsClassifier()中默认为欧拉距离
在这里插入图片描述
在这里插入图片描述

寻找最优模型

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y)

%%time
best_k = 0
best_score = 0.0
best_clf = None
best_method = None
best_p = 0
for p in range(1, 6):
    for weight in ['uniform', 'distance']:
        for k in range(1, 21):
            knn_clf = KNeighborsClassifier(n_neighbors=k, weights=weight, p=p)
            knn_clf.fit(X_train, y_train)
            score = knn_clf.score(X_test, y_test)
            if score>best_score:
                best_score = score
                best_k = k
                best_clf = knn_clf
                best_method = weight
                best_p = p
print(best_k)
print(best_score)
print(best_clf)
print(best_method)
print(best_p)

在这里插入图片描述

网格搜索的使用


本次网格搜索的数据集以手写识别数据集为例。

  1. 获取数据,可以打印描述信息进行查看。
from sklearn.datasets import load_digits # 导入手写识别数据集
import numpy as np
from matplotlib import pyplot as plt

digits = load_digits()

X = digits.data
y = digits.target

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y)

在这里插入图片描述

  1. 绘制出手写数字
x = X_train[1000].reshape(8, -1)
plt.imshow(x, cmap=plt.cm.binary)
plt.show()

在这里插入图片描述

  1. 使用sklearn中的grid search
# 创建网格参数,每一组参数放在一个字典中
param_grid = [
    {'weights':['uniform'],
     'n_neighbors':[i for i in range(1,21)]
    },
    {
        'weights':['distance'],
        'n_neighbors': [i for i in range(1,21)],
        'p':[i for i in range(1,6)]
    }
] 

from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier()

%%time
# 尝试寻找最佳参数
grid_search = GridSearchCV(knn_clf, param_grid, verbose=2, n_jobs=-1) # verbose越大越详细,n_jobs调用几个cpu进行计算,当n_jobs=-1时表示调用所有cpu进行计算
grid_search.fit(X_train, y_train)

grid_search.best_estimator_
grid_search.best_score_
grid_search.best_params_

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Yolov7是一个目标检测算法,数据集处理包括以下几个步骤: 1. 数据集准备:首先,你需要收集和整理有标注的图像数据集。每张图像都需要有对应的标注文件,标注文件一般使用PASCAL VOC格式或者COCO格式。确保每个标注文件包含目标的类别和边界框信息。 2. 数据集划分:将整个数据集划分为训练集、验证集和测试集。训练集用于模型的训练,验证集用于调整模型的超参数和进行模型选择,测试集用于评估训练好的模型的性能。 3. 数据增强:为了增加数据集的多样性和泛化能力,可以对图像进行一些变换操作,如随机裁剪、缩放、旋转、翻转等。同时,需要相应地更新标注信息。 4. 数据集转换:Yolov7需要将图像和标注信息转换为合适的格式,一般为Darknet的格式。可以使用相应的工具或脚本将数据集转换为Yolov7所需的格式。 5. 数据加载:在训练过程中,需要编写代码加载数据集,并按批次输入给模型进行训练。可以使用Python中的图像处理库(如OpenCV)或者深度学习框架(如PyTorch、TensorFlow)提供的API进行数据加载。 6. 数据预处理:在输入模型之前,需要对图像进行预处理,如缩放到固定尺寸、归一化、转换为模型所需的张量格式等操作。同时,需要对标注信息进行相应的处理,如将边界框转换为相对于图像尺寸的坐标。 以上是对Yolov7数据集处理的一般步骤,具体实现上可能会根据实际情况有所不同。如果你有具体的问题,可以提供更多细节,我可以给出更具体的建议。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

街 三 仔

你的鼓励是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值