KNN算法——特征预处理

目录

归一化

标准化

案例 利用KNN算法对鸢尾花分类

归一化

什么是归一化?

特征归一化是一种数据预处理技术,它有助于将不同特征的值缩放到相似的范围,以确保模型能够更好地学习和收敛。

• 归一化:通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间

为什么归一化?

  1. 帮助模型更快地收敛:当特征的值处于不同的范围时,模型可能需要更多的迭代才能找到最优解。通过归一化,可以将特征的值缩放到相似的范围,从而帮助模型更快地收敛。

  2. 避免特征权重偏向:如果特征的值处于不同的范围,那么模型可能会更多地关注值较大的特征,而忽略值较小的特征。通过归一化,可以避免这种情况,确保模型能够平衡地考虑所有特征。

  3. 提高模型的性能:归一化可以提高模型的性能,减少过拟合的风险,并改善模型的泛化能力。通过确保特征的值处于相似的范围,模型能够更好地泛化到新的数据上。

算法实现

from sklearn.preprocessing import MinMaxScaler  # 导入MinMaxScaler类,用于将数据特征缩放到指定的范围内
data=[[88,90,4],[77,96,6],[52,95,2],[89,52,7]]  # 创建一个包含四个样本的二维列表,每个样本有三个特征值
print(data)  # 打印原始数据

model=MinMaxScaler()  # 创建一个MinMaxScaler对象,用于进行特征缩放
data=model.fit_transform(data)  # 使用fit_transform()方法对原始数据进行特征缩放,将数据缩放到[0,1]范围内
print(data)  # 打印特征缩放后的数据

运行结果

标准化

标准化是数据预处理中的一种常见技术,其目的是使数据集的特征在统计意义上具有相似的尺度,以便更好地进行分析和模型训练。在标准化过程中,通常会对数据的特征进行线性变换,使其均值为0,标准差为1。

具体而言,标准化的过程如下:

  1. 计算每个特征的均值(mean)和标准差(standard deviation)。
  2. 对每个特征进行线性变换,使其均值为0,标准差为1。这通常通过减去均值,然后除以标准差来实现。
  3. 最终得到的数据集,每个特征的均值为0,标准差为1。

标准化的好处包括:

  1. 消除特征间的量纲差异: 当特征具有不同的量纲(比如长度、重量、温度等),它们的数值范围可能相差很大,这会影响到某些机器学习算法的表现。标准化可以消除这种差异,使得特征的数值范围相似。
  2. 加速模型收敛: 在训练模型时,标准化可以加速优化算法的收敛速度,使得模型更快地达到最优解。
  3. 提高模型的鲁棒性: 标准化可以使得数据更加稳定,减少了异常值对模型的影响,提高了模型的鲁棒性。

总之,标准化是数据预处理中一项重要的技术,常用于各种机器学习任务中,以提高模型的性能和稳定性。

算法实现

from sklearn.preprocessing import StandardScalerdata = [[88, 90, 4], [77, 96, 6], [52, 95, 2], [89, 52, 7]]
    # 2. 初始化标准化对象
    transformer = StandardScaler()
    # 3. 对原始特征进行变换
    data = transformer.fit_transform(data)
    # 4. 打印归一化后的结果
    print(data)
    # 5 打印每1列数据的均值和标准差
    print('transfer.mean_-->', transformer.mean_)
    print('transfer.var_-->', transformer.var_

运行结果

案例 利用KNN算法对鸢尾花分类

import pandas as pd
from sklearn.datasets import load_iris
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier #导入K最近邻分类器类
from sklearn.preprocessing import StandardScaler


iris_data=load_iris() #加载数据集
# print(iris_data.feature_names) #查看特征值
# print(iris_data.target_names) #查看目标值

#加载数据集
def show01():
    iris_df = pd.DataFrame(iris_data['data'],columns=iris_data.feature_names)
    iris_df['target'] = iris_data.target
    print(iris_df)

def show2():
    iris_df = pd.DataFrame(iris_data['data'],columns=iris_data.feature_names)
    iris_df['target'] = iris_data.target
    feature_name = iris_data.feature_names
    for i in range(len(feature_name)):
        for j in range(i+1,len(feature_name)):
            x=feature_name[i]
            y=feature_name[j]
            sns.lmplot(x=x,y=y,data=iris_df,hue='target')
            plt.show()

#数据集划分
def show03():
    mydata=load_iris()
    x_train, x_test, y_train, y_test = train_test_split(mydata.data, mydata.target, train_size=0.7, random_state=22)
    print('数据总数量', len(mydata.data))
    print('训练集中的x-特征值', len(x_train))
    print('测试集中的x-特征值', len(x_test))
    print(y_train)

#模型训练
def dm04_模型训练和预测():
    # 1 获取数据集
    mydataset = load_iris()
    # 2 数据基本处理
    x_train, x_test, y_train, y_test = train_test_split(mydataset.data, mydataset.target, test_size=0.2,
    random_state=22)
    # 3 数据集预处理-数据标准化
    transfer = StandardScaler()
    x_train = transfer.fit_transform(x_train)

    # 让测试集的均值和方差, 转换测试集数据;
    x_test = transfer.transform(x_test)

    # 4 机器学习(模型训练)
    estimator = KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train, y_train)

    # 5 模型评估 直接计算准确率 100个样本中模型预测对了多少
    myscore = estimator.score(x_test, y_test)
    print('myscore-->', myscore)

    # 6 模型预测 # 需要对待预测数据,执行标准化
    print('通过模型查看分类类别-->', estimator.classes_)
    mydata = [[5.1, 3.5, 1.4, 0.2],
    [4.6, 3.1, 1.5, 0.2]]
    mydata = transfer.transform(mydata)
    print('mydata-->', mydata)
    mypred = estimator.predict(mydata)
    print('mypred-->\n', mypred)
    mypred = estimator.predict_proba(mydata)
    print('mypred-->\n', mypred)

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值