目录
归一化
•什么是归一化?
特征归一化是一种数据预处理技术,它有助于将不同特征的值缩放到相似的范围,以确保模型能够更好地学习和收敛。
• 归一化:通过对原始数据进行变换把数据映射到【mi,mx】(默认为[0,1])之间
•为什么归一化?
-
帮助模型更快地收敛:当特征的值处于不同的范围时,模型可能需要更多的迭代才能找到最优解。通过归一化,可以将特征的值缩放到相似的范围,从而帮助模型更快地收敛。
-
避免特征权重偏向:如果特征的值处于不同的范围,那么模型可能会更多地关注值较大的特征,而忽略值较小的特征。通过归一化,可以避免这种情况,确保模型能够平衡地考虑所有特征。
-
提高模型的性能:归一化可以提高模型的性能,减少过拟合的风险,并改善模型的泛化能力。通过确保特征的值处于相似的范围,模型能够更好地泛化到新的数据上。
算法实现
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。
具体而言,标准化的过程如下:
- 计算每个特征的均值(mean)和标准差(standard deviation)。
- 对每个特征进行线性变换,使其均值为0,标准差为1。这通常通过减去均值,然后除以标准差来实现。
- 最终得到的数据集,每个特征的均值为0,标准差为1。
标准化的好处包括:
- 消除特征间的量纲差异: 当特征具有不同的量纲(比如长度、重量、温度等),它们的数值范围可能相差很大,这会影响到某些机器学习算法的表现。标准化可以消除这种差异,使得特征的数值范围相似。
- 加速模型收敛: 在训练模型时,标准化可以加速优化算法的收敛速度,使得模型更快地达到最优解。
- 提高模型的鲁棒性: 标准化可以使得数据更加稳定,减少了异常值对模型的影响,提高了模型的鲁棒性。
总之,标准化是数据预处理中一项重要的技术,常用于各种机器学习任务中,以提高模型的性能和稳定性。
算法实现
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)