python3机器学习经典算法与应用之判断机器学习算法的性能(一)

性能判断

我们使用训练集数据进行训练得到机器学习模型,但是模型对于新数据的标签的预测准确度是我们十分关心的。计算模型的损失用来衡量一个模型的性能好坏。

训练集数据的分离,将原本的训练数据分为训练集和验证集两部分,但其实还应该再分为测试集一部分。将原本根据训练数据得到的机器模型应用于测试集数据来计算测试损失,从而来估计损失。

首先介绍一下numpy.random,shuffle()函数和numpy.random.permutation()函数
numpy.random,shuffle(x)是进行原地洗牌,直接改变x的值,而无返回值。对于多维度的array来说,只对第一维进行洗牌
numpy.random,permutation(x)是返回一个被洗牌过的array,而x不变。对于多维度的array来说,只对第一维进行洗牌

首先导入鸢尾花数据集,然后查看数据集会发现标签集y是排列有序的,如果直接按照百分比进行训练集和测试集划分,数据的不随机性会导致模型的性能大大降低。所以首要操作就是随机化。下面使用了随机化索引的方式。
在这里插入图片描述
y的数据标签是排放有序的,不能直接按照比例取,要随机!!!取,否则模型的性能肯定很差,所以要先乱序处理。
注意:x和y的数据是一一对应的,所以要x和y同时随机化。
有两种方式进行随机化:

  1. 将x和y合成一个矩阵,然后随机化后再拆分成两个矩阵
  2. 对索引进行乱序处理,然后只需要根据索引取值就可以达到乱序的目的
    在这里插入图片描述
    观察上图可知,使用numpy.random.permutation()函数可以达到乱序的目的。同时要设置测试集test_ratio所占比例(上例中为0.2),然后计算测试集的元素个数test_size(长度),上图中为30,总元素为150。
    在这里插入图片描述
    经过计算后,将原训练集根据索引进行划分为训练集和测试集两部分。可以发现训练集和测试集使用索引进行关联。测试集30条,训练集120条。

再使用上一节写的KNN分类器进行训练,计算最终的准确率(预测正确测试数据的个数除以总测试集记录个数),可以看到最终的准确率为83.3%
在这里插入图片描述
jupyter notebook代码统一整理:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris() #加载鸢尾花数据集
x = iris.data  #鸢尾花数据集的特征值
y = iris.target  #鸢尾花数据集的标签值
x.shape
y.shape
y
#y的数据标签是排放有序的,不能直接按照比例去,要随机!!!取,否则模型的性能肯定很差,所以要先乱序处理
#x和y的数据是一一对应的,所以要x和y同时随机化
#1.将x和y合成一个矩阵,然后随机化后再拆分成两个矩阵
#2.对索引进行乱序处理
shuffle_indexes = np.random.permutation(len(x)) #对[0,149]进行随机排序,len(x)==150
shuffle_indexes
test_ratio = 0.2
test_size = int(len(x)*test_ratio)
test_size
test_indexes = shuffle_indexes[:test_size]
train_indexes = shuffle_indexes[test_size:]
X_tarin = x[train_indexes]
Y_train = y[train_indexes]

X_test = x[test_indexes]
Y_test = y[test_indexes]
print(X_tarin.shape)
print(Y_train.shape)
print(X_test.shape)
print(Y_test.shape)
from KNN import KNNClassifier
my_knn_clf = KNNClassifier(k=3)
my_knn_clf.fit(X_tarin,Y_train)
y_predict = my_knn_clf.predict(X_test)
y_predict
Y_test
sum(y_predict == Y_test)
sum(y_predict == Y_test) / len(Y_test)
from sklearn.model_selection import train_test_split
X_tarin,X_test,Y_train,Y_test = train_test_split(x,y,test_size=0.3)
print(X_tarin.shape)
print(Y_train.shape)
print(X_test.shape)
print(Y_test.shape)

将模型准确率的算法进行封装:

import numpy as np

def train_test_split(x,y,test_ratio=0.2,seed=None):
    """将数据 x 和 y 按照test_ratio分割成X_tarin、Y_tarin、X_test、Y_test"""
    assert x.shape[0]==y.shape[0],"the size of x must equal to the size of y."
    assert 0.0<=test_ratio<=1.0,"test_ration must be valid!"

    if seed:
        np.random.seed(seed) #设置随机数种子

    shuffle_indexes = np.random.permutation(len(x))  #随机化原训练集的索引
    test_size = int(len(x) * test_ratio)  #设置训练集和测试集的比例
    test_indexes = shuffle_indexes[:test_size]  #测试集的索引
    train_indexes = shuffle_indexes[test_size:]  #训练集的索引
    #构建测试集和训练集数据
    X_tarin = x[train_indexes]
    Y_train = y[train_indexes]

    X_test = x[test_indexes]
    Y_test = y[test_indexes]
    return X_tarin,X_test,Y_train,Y_test

这里使用断言保证test_ratio在[0,1]范围内,并且样本数和标签数一致。设置随机数种子,然后随机化索引,再根据随机化后的索引将原训练集数据按照比例分为训练集和测试集数据。

sklearn中封装好的train_test_split()方法

sklearn.model_selection中包含train_test_split()方法,通过下面的方法可以看出设置test_size为0.3,即测试集的元素个数为150*0.3 = 45个,训练集元素个数为105个。
在这里插入图片描述
可以使用sklearn包装好的KNN算法进行预测结果。我们自己写的KNN算法就是在模仿sklearn包装好的KNN算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值