一、数据集划分
机器学习一般的数据集会划分为两个部分:
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效
划分比例:
- 训练集:70% 80% 75%
- 测试集:30% 20% 25%
数据集划分api
- sklearn.model_selection.train_test_split(arrays, *options)
- 参数:
- x 数据集的特征值
- y 数据集的标签值
- test_size 测试集的大小,一般为float
- random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
- return
- x_train, x_test, y_train, y_test
- 参数:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
# 1、获取鸢尾花数据集
iris = load_iris()
# 对鸢尾花数据集进行分割
# 训练集的特征值x_train 测试集的特征值x_test 训练集的目标值y_train 测试集的目标值y_test
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
二、数据归一化
可以看出,鸢尾花的4个特征数据的分布不在同一个区间,这样不利于机器学习模型的训练,因此需要对特征数据进行归一化处理。
-
为什么我们要进行归一化?
- 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
定义
通过对原始数据进行变换把数据映射到(默认为[0,1])之间,
公式
API:
sklearn.preprocessing.MinMaxScaler (feature_range=(0,1) )
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
iris_data = pd.DataFrame(iris["data"], columns=['sepal length',
'sepal width',
'petal length',
'petal width'])
def min_max_demo(data):
"""
演示数据归一化
"""
transfer = MinMaxScaler(feature_range=(0,1))
res_data = transfer.fit_transform(data[['sepal length',
'sepal width',
'petal length',
'petal width']])
print(res_data)
print(min_max_demo(iris_data))
三、标准化
问题:如果数据中异常点较多,会有什么影响?
注意:最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性较差,只适合传统精确小数据场景。
定义:
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内。
公式:
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
API:
sklearn.preprocessing.StandardScaler( )
- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
- StandardScaler.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
iris_data = pd.DataFrame(iris["data"], columns=['sepal length',
'sepal width',
'petal length',
'petal width'])
def stand_demo(data):
"""
演示数据标准化
"""
transfer = StandardScaler()
res_data = transfer.fit_transform(data[['sepal length',
'sepal width',
'petal length',
'petal width']])
print(res_data)
print('每一列的方差为:\n:', transfer.mean_)
print('每一列的标准差为:\n:', transfer.var_)