【机器学习 - 3】:数据归一化(最值归一化、均值方差归一化)

数据归一化的使用


为什么要使用数据归一化?
举个例子,例如我们要使用KNN算法来预测肿瘤为良性肿瘤或恶性肿瘤。以下是一些数据:

肿瘤大小(厘米)发现时间(天)肿瘤类型
样本11200良性肿瘤
样本25100恶性肿瘤
样本32150良性肿瘤

根据以上数据,画出散点图

import numpy as np
import matplotlib.pyplot as plt

# 训练集数据
X_train = np.array([
    [1, 200],
    [5, 100],
    [2, 150]
])
y_train = np.array([1,0,1]) # 1为良性,0为恶性

# 绘制散点图
plt.figure(dpi=100)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文
plt.scatter(X_train[y_train==1, 0], X_train[y_train==1,1], color='b') # 蓝色为良性
plt.scatter(X_train[y_train==0, 0], X_train[y_train==0,1], color='r')
plt.xlabel("肿瘤大小(厘米)")
plt.ylabel("发现时间(天)")
plt.legend(loc="best")
plt.show()

在这里插入图片描述
观察上图,并未发现任何问题。当我们计算样本1和样本2的距离时,公式为:
在这里插入图片描述
我们可发现纵坐标的数据远远大于横坐标的数据。这样在我们进行计算时,由于发现时间的影响远大于肿瘤大小的影响,所以预测相当于只采用了一个特征。

因此我们需要进行数据归一化

最值归一化


最值归一化:把所有数据映射到0-1之间。公式如下:
在这里插入图片描述
以上述例子为例:对发现时间的特征进行最值归一化。

import numpy as np
X = np.array([
    [1, 200],
    [5, 100],
    [2, 150]
])
X = np.array(X, dtype='float')
X[:,1] = (X[:,1]-np.min(X[:,1]))/(np.max(X[:,1])-np.min(X[:,1]))

在这里插入图片描述

均值方差归一化(常用)

均值方差归一化:它是把所有数据归到均值为0,方差为1的分布中。即确保最终得到的数据均值为0,方差为1。公式如下:
在这里插入图片描述
以上述例子为例:对发现时间的特征进行均值方差归一化。

import numpy as np
X = np.array([
    [1, 200],
    [5, 100],
    [2, 150]
])
X = np.array(X, dtype='float')
X[:,1] = (X[:,1]-np.mean(X[:,1]))/np.std(X[:,1]) #np.std()--求方差

在这里插入图片描述

在sklearn中调用归一化(鸢尾花数据归一化)

  1. 导入模块
import numpy as np
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler # 均值方差归一化
from sklearn.model_selection import train_test_split
  1. 获取数据并预处理
iris = load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

std_scaler = StandardScaler()
std_scaler.fit(X_train) # 计算均值和方差

X_std_train = std_scaler.transform(X_train) # 对训练集特征进行归一化处理
X_std_test = std_scaler.transform(X_test) # 对测试集特征进行归一化处理

在这里插入图片描述
在这里插入图片描述

  1. 调用sklearn中的KNN算法,计算出准确率
from sklearn.neighbors import KNeighborsClassifier

knn_clf = KNeighborsClassifier()
knn_clf.fit(X_std_train, y_train)

knn_clf.score(X_std_test, y_test)

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

街 三 仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值