sklearn 数据集划分和数据预处理

一、数据集划分

机器学习一般的数据集会划分为两个部分:

  • 训练数据:用于训练,构建模型
  • 测试数据:在模型检验时使用,用于评估模型是否有效

划分比例:

  • 训练集: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_)

猜你喜欢

转载自blog.csdn.net/qq_39197555/article/details/115202257
今日推荐