三、数据预处理

作者:Chris Albon

译者:飞龙

协议:CC BY-NC-SA 4.0

为 Scikit-Learn 转换 Pandas 类别数据

  1. # 导入所需的库
  2. from sklearn import preprocessing
  3. import pandas as pd
  4. raw_data = {'patient': [1, 1, 1, 2, 2],
  5. 'obs': [1, 2, 3, 1, 2],
  6. 'treatment': [0, 1, 0, 1, 0],
  7. 'score': ['strong', 'weak', 'normal', 'weak', 'strong']}
  8. df = pd.DataFrame(raw_data, columns = ['patient', 'obs', 'treatment', 'score'])
  9. # 创建标签(类别)编码对象
  10. le = preprocessing.LabelEncoder()
  11. # 使编码器拟合 pandas 列
  12. le.fit(df['score'])
  13. # LabelEncoder()
  14. # 查看标签(如果你希望)
  15. list(le.classes_)
  16. # ['normal', 'strong', 'weak']
  17. # 将拟合的编码器应用于 pandas 列
  18. le.transform(df['score'])
  19. # array([1, 2, 0, 2, 1])
  20. # 将一些整数转换为它们的类别名称
  21. list(le.inverse_transform([2, 2, 1]))
  22. # ['weak', 'weak', 'strong']

删除带缺失值的观测

  1. # 加载库
  2. import numpy as np
  3. import pandas as pd
  4. # 创建特征矩阵
  5. X = np.array([[1.1, 11.1],
  6. [2.2, 22.2],
  7. [3.3, 33.3],
  8. [4.4, 44.4],
  9. [np.nan, 55]])
  10. # 移除带缺失值的观测
  11. X[~np.isnan(X).any(axis=1)]
  12. '''
  13. array([[ 1.1, 11.1],
  14. [ 2.2, 22.2],
  15. [ 3.3, 33.3],
  16. [ 4.4, 44.4]])
  17. '''

删除缺失值

  1. # 加载库
  2. import numpy as np
  3. import pandas as pd
  4. # 创建特征矩阵
  5. X = np.array([[1, 2],
  6. [6, 3],
  7. [8, 4],
  8. [9, 5],
  9. [np.nan, 4]])
  10. # 移除带缺失值的观测
  11. X[~np.isnan(X).any(axis=1)]
  12. array([[ 1., 2.],
  13. [ 6., 3.],
  14. [ 8., 4.],
  15. [ 9., 5.]])
  16. # 将数据加载为数据帧
  17. df = pd.DataFrame(X, columns=['feature_1', 'feature_2'])
  18. # 移除带缺失值的观测
  19. df.dropna()
feature_1feature_2
01.02.0
16.03.0
28.04.0
39.05.0

检测离群点

  1. # 加载库
  2. import numpy as np
  3. from sklearn.covariance import EllipticEnvelope
  4. from sklearn.datasets import make_blobs
  5. # 创建模拟数据
  6. X, _ = make_blobs(n_samples = 10,
  7. n_features = 2,
  8. centers = 1,
  9. random_state = 1)
  10. # 将第一个观测值替换为异常值
  11. X[0,0] = 10000
  12. X[0,1] = 10000

EllipticEnvelope假设数据是正态分布的,并且基于该假设,在数据周围“绘制”椭圆,将椭圆内的任何观测分类为正常(标记为1),并将椭圆外的任何观测分类为异常值(标记为-1)。 这种方法的一个主要限制是,需要指定一个contamination参数,该参数是异常观测值的比例,这是我们不知道的值。

  1. # 创建检测器
  2. outlier_detector = EllipticEnvelope(contamination=.1)
  3. # 拟合检测器
  4. outlier_detector.fit(X)
  5. # 预测离群点
  6. outlier_detector.predict(X)
  7. # array([-1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

离散化特征

  1. # 加载库
  2. from sklearn.preprocessing import Binarizer
  3. import numpy as np
  4. # 创建特征
  5. age = np.array([[6],
  6. [12],
  7. [20],
  8. [36],
  9. [65]])
  10. # 创建二值化器
  11. binarizer = Binarizer(18)
  12. # 转换特征
  13. binarizer.fit_transform(age)
  14. '''
  15. array([[0],
  16. [0],
  17. [1],
  18. [1],
  19. [1]])
  20. '''
  21. # 对特征分箱
  22. np.digitize(age, bins=[20,30,64])
  23. '''
  24. array([[0],
  25. [0],
  26. [1],
  27. [2],
  28. [3]])
  29. '''

编码序数类别特征

  1. # 加载库
  2. import pandas as pd
  3. # 创建特征
  4. df = pd.DataFrame({'Score': ['Low',
  5. 'Low',
  6. 'Medium',
  7. 'Medium',
  8. 'High']})
  9. # 查看数据帧
  10. df
Score
0Low
1Low
2Medium
3Medium
4High

创建比例映射

  1. # 创建映射器
  2. scale_mapper = {'Low':1,
  3. 'Medium':2,
  4. 'High':3}
  5. # 将特征值映射为比例
  6. df['Scale'] = df['Score'].replace(scale_mapper)
  7. # 查看数据帧
  8. df
ScoreScale
0Low1
1Low1
2Medium2
3Medium2
4High3

使用下采样处理不平衡类

三、数据预处理 - 图1

在下采样中,我们从多数类(即具有更多观测值的类)中不放回随机抽样,来创建与少数类相等的新观测子集。

  1. # 加载库
  2. import numpy as np
  3. from sklearn.datasets import load_iris
  4. # 加载鸢尾花数据
  5. iris = load_iris()
  6. # 创建特征矩阵
  7. X = iris.data
  8. # 创建目标向量
  9. y = iris.target
  10. # 移除前 40 个观测
  11. X = X[40:,:]
  12. y = y[40:]
  13. # 创建二元目标向量,表示是否是类 0
  14. y = np.where((y == 0), 0, 1)
  15. # 查看不平衡的目标向量
  16. y
  17. '''
  18. array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  19. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  20. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  21. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  22. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
  23. '''
  24. # 每个类别的观测的下标
  25. i_class0 = np.where(y == 0)[0]
  26. i_class1 = np.where(y == 1)[0]
  27. # 每个类别的观测数量
  28. n_class0 = len(i_class0)
  29. n_class1 = len(i_class1)
  30. # 对于类 0 的每个观测,随机从类 1 不放回采样
  31. i_class1_downsampled = np.random.choice(i_class1, size=n_class0, replace=False)
  32. # 将类 0 的目标向量,和下采样的类 1 的目标向量连接到一起
  33. np.hstack((y[i_class0], y[i_class1_downsampled]))
  34. # array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])

使用上采样处理不平衡类别

三、数据预处理 - 图2

在上采样中,对于多数类中的每个观测,我们从少数类中带放回随机选择观测。 最终结果是来自少数类和多数类的观测数量相同。

  1. # 加载库
  2. import numpy as np
  3. from sklearn.datasets import load_iris
  4. # 加载鸢尾花数据
  5. iris = load_iris()
  6. # 创建特征矩阵
  7. X = iris.data
  8. # 创建目标向量
  9. y = iris.target
  10. # 移除前 40 个观测
  11. X = X[40:,:]
  12. y = y[40:]
  13. # 创建二元目标向量,表示是否是类 0
  14. y = np.where((y == 0), 0, 1)
  15. # 查看不平衡的目标向量
  16. y
  17. '''
  18. array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  19. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  20. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  21. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  22. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
  23. '''
  24. # 每个类别的观测的下标
  25. i_class0 = np.where(y == 0)[0]
  26. i_class1 = np.where(y == 1)[0]
  27. # 每个类别的观测数量
  28. n_class0 = len(i_class0)
  29. n_class1 = len(i_class1)
  30. # 对于类 1 中的每个观测,我们从类 0 中带放回随机选择观测。
  31. i_class0_upsampled = np.random.choice(i_class0, size=n_class1, replace=True)
  32. # 将类 0 的上采样的目标向量,和类 1 的目标向量连接到一起
  33. np.concatenate((y[i_class0_upsampled], y[i_class1]))
  34. '''
  35. array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  36. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  37. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  38. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  39. 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  40. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  41. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  42. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
  43. 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
  44. '''

处理离群点

三、数据预处理 - 图3

  1. # 加载库
  2. import pandas as pd
  3. # 创建 DataFrame
  4. houses = pd.DataFrame()
  5. houses['Price'] = [534433, 392333, 293222, 4322032]
  6. houses['Bathrooms'] = [2, 3.5, 2, 116]
  7. houses['Square_Feet'] = [1500, 2500, 1500, 48000]
  8. houses
PriceBathroomsSquare_Feet
05344332.01500
13923333.52500
22932222.01500
34322032116.048000

选择 1:丢弃

  1. # 丢弃大于某个值的观测
  2. houses[houses['Bathrooms'] < 20]
PriceBathroomsSquare_Feet
05344332.01500
13923333.52500
22932222.01500

选择 2:标记

  1. # 加载库
  2. import numpy as np
  3. # 基于布尔条件创建特征
  4. houses['Outlier'] = np.where(houses['Bathrooms'] < 20, 0, 1)
  5. # 展示数据
  6. houses
PriceBathroomsSquare_FeetOutlier
05344332.015000
13923333.525000
22932222.015000
34322032116.0480001

选择 3:重缩放

  1. # 对数特征
  2. houses['Log_Of_Square_Feet'] = [np.log(x) for x in houses['Square_Feet']]
  3. # 展示数据
  4. houses
PriceBathroomsSquare_FeetOutlierLog_Of_Square_Feet
05344332.0150007.313220
13923333.5250007.824046
22932222.0150007.313220
34322032116.048000110.778956

使用均值填充缺失值

均值插补用该特征/变量的平均值替换缺失值。 平均插补是最“朴素”的插补方法之一,因为不像 k 最近邻居插补这样的更复杂的方法,它不会使用观测的信息来估计它的值。

  1. import pandas as pd
  2. import numpy as np
  3. from sklearn.preprocessing import Imputer
  4. # 创建空数据集
  5. df = pd.DataFrame()
  6. # 创建两个变量,叫做 x0 和 x1
  7. # 使 x1 的第一个值为缺失值
  8. df['x0'] = [0.3051,0.4949,0.6974,0.3769,0.2231,0.341,0.4436,0.5897,0.6308,0.5]
  9. df['x1'] = [np.nan,0.2654,0.2615,0.5846,0.4615,0.8308,0.4962,0.3269,0.5346,0.6731]
  10. # 观察数据集
  11. df
x0x1
00.3051NaN
10.49490.2654
20.69740.2615
30.37690.5846
40.22310.4615
50.34100.8308
60.44360.4962
70.58970.3269
80.63080.5346
90.50000.6731

拟合填充器

  1. # 创建一个填充器对象,它寻找 NaN 值,之后将它们按列替换为特征的均值
  2. mean_imputer = Imputer(missing_values='NaN', strategy='mean', axis=0)
  3. # 在 df 数据及上训练填充器
  4. mean_imputer = mean_imputer.fit(df)
  5. # 将填充器应用于 df 数据集
  6. imputed_df = mean_imputer.transform(df.values)
  7. # 查看数据
  8. imputed_df
  9. '''
  10. array([[ 0.3051 , 0.49273333],
  11. [ 0.4949 , 0.2654 ],
  12. [ 0.6974 , 0.2615 ],
  13. [ 0.3769 , 0.5846 ],
  14. [ 0.2231 , 0.4615 ],
  15. [ 0.341 , 0.8308 ],
  16. [ 0.4436 , 0.4962 ],
  17. [ 0.5897 , 0.3269 ],
  18. [ 0.6308 , 0.5346 ],
  19. [ 0.5 , 0.6731 ]])
  20. '''

请注意,0.49273333是估算值,取代了np.NaN值。

填充缺失的类标签

  1. # 加载库
  2. import numpy as np
  3. from sklearn.preprocessing import Imputer
  4. # 创建带有类别特征的特征矩阵
  5. X = np.array([[0, 2.10, 1.45],
  6. [1, 1.18, 1.33],
  7. [0, 1.22, 1.27],
  8. [0, -0.21, -1.19],
  9. [np.nan, 0.87, 1.31],
  10. [np.nan, -0.67, -0.22]])
  11. # 创建填充器对象
  12. imputer = Imputer(strategy='most_frequent', axis=0)
  13. # 使用最频繁的类别填充缺失值
  14. imputer.fit_transform(X)
  15. '''
  16. array([[ 0. , 2.1 , 1.45],
  17. [ 1. , 1.18, 1.33],
  18. [ 0. , 1.22, 1.27],
  19. [ 0. , -0.21, -1.19],
  20. [ 0. , 0.87, 1.31],
  21. [ 0. , -0.67, -0.22]])
  22. '''

使用 KNN 填充缺失类别

  1. # 加载库
  2. import numpy as np
  3. from sklearn.neighbors import KNeighborsClassifier
  4. # 创建带有类别特征的特征矩阵
  5. X = np.array([[0, 2.10, 1.45],
  6. [1, 1.18, 1.33],
  7. [0, 1.22, 1.27],
  8. [1, -0.21, -1.19]])
  9. # 创建类别特征有缺失的特征矩阵
  10. X_with_nan = np.array([[np.nan, 0.87, 1.31],
  11. [np.nan, -0.67, -0.22]])
  12. # 训练 KNN 学习器
  13. clf = KNeighborsClassifier(3, weights='distance')
  14. trained_model = clf.fit(X[:,1:], X[:,0])
  15. # 预测缺失值的类别
  16. imputed_values = trained_model.predict(X_with_nan[:,1:])
  17. # 将预测分类的列和它们的其它特征连接
  18. X_with_imputed = np.hstack((imputed_values.reshape(-1,1), X_with_nan[:,1:]))
  19. # 连接两个特征矩阵
  20. np.vstack((X_with_imputed, X))
  21. '''
  22. array([[ 0. , 0.87, 1.31],
  23. [ 1. , -0.67, -0.22],
  24. [ 0. , 2.1 , 1.45],
  25. [ 1. , 1.18, 1.33],
  26. [ 0. , 1.22, 1.27],
  27. [ 1. , -0.21, -1.19]])
  28. '''

观测正则化

三、数据预处理 - 图4

  1. # 加载库
  2. from sklearn.preprocessing import Normalizer
  3. import numpy as np
  4. # 创建特征矩阵
  5. X = np.array([[0.5, 0.5],
  6. [1.1, 3.4],
  7. [1.5, 20.2],
  8. [1.63, 34.4],
  9. [10.9, 3.3]])

Normalizer重缩放各个观侧,使其具有单位范数(长度之和为 1)。

  1. # 创建正则化器
  2. normalizer = Normalizer(norm='l2')
  3. # 转换特征矩阵
  4. normalizer.transform(X)
  5. '''
  6. array([[ 0.70710678, 0.70710678],
  7. [ 0.30782029, 0.95144452],
  8. [ 0.07405353, 0.99725427],
  9. [ 0.04733062, 0.99887928],
  10. [ 0.95709822, 0.28976368]])
  11. '''

多个标签的独热编码特征

  1. # 加载库
  2. from sklearn.preprocessing import MultiLabelBinarizer
  3. import numpy as np
  4. # 创建 NumPy 数组
  5. y = [('Texas', 'Florida'),
  6. ('California', 'Alabama'),
  7. ('Texas', 'Florida'),
  8. ('Delware', 'Florida'),
  9. ('Texas', 'Alabama')]
  10. # 创建 MultiLabelBinarizer 对象
  11. one_hot = MultiLabelBinarizer()
  12. # 独热编码数据
  13. one_hot.fit_transform(y)
  14. '''
  15. array([[0, 0, 0, 1, 1],
  16. [1, 1, 0, 0, 0],
  17. [0, 0, 0, 1, 1],
  18. [0, 0, 1, 1, 0],
  19. [1, 0, 0, 0, 1]])
  20. '''
  21. # 查看类别
  22. one_hot.classes_
  23. # array(['Alabama', 'California', 'Delware', 'Florida', 'Texas'], dtype=object)

独热编码标称类别特征

三、数据预处理 - 图5

  1. # 加载库
  2. import numpy as np
  3. import pandas as pd
  4. from sklearn.preprocessing import LabelBinarizer
  5. # 创建 NumPy 数组
  6. x = np.array([['Texas'],
  7. ['California'],
  8. ['Texas'],
  9. ['Delaware'],
  10. ['Texas']])
  11. # 创建 LabelBinzarizer 对象
  12. one_hot = LabelBinarizer()
  13. # 独热编码数据
  14. one_hot.fit_transform(x)
  15. '''
  16. array([[0, 0, 1],
  17. [1, 0, 0],
  18. [0, 0, 1],
  19. [0, 1, 0],
  20. [0, 0, 1]])
  21. '''
  22. # 查看类别
  23. one_hot.classes_
  24. '''
  25. array(['California', 'Delaware', 'Texas'],
  26. dtype='<U10')
  27. '''
  28. # 虚拟特征
  29. pd.get_dummies(x[:,0])
CaliforniaDelawareTexas
0001
1100
2001
3010
4001

预处理类别特征

通常,机器学习方法(例如逻辑回归,具有线性核的 SVM 等)将要求将类别变量转换为虚拟变量(也称为独热编码)。 例如,单个特征Fruit将被转换为三个特征,ApplesOrangesBananas,类别特征中的每个类别一个。

有一些常用的方法可以预处理分类特征:使用 pandas 或 scikit-learn。

  1. from sklearn import preprocessing
  2. from sklearn.pipeline import Pipeline
  3. import pandas as pd
  4. raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
  5. 'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
  6. 'age': [42, 52, 36, 24, 73],
  7. 'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
  8. df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
  9. df
first_namelast_nameagecity
0JasonMiller42San Francisco
1MollyJacobson52Baltimore
2TinaAli36Miami
3JakeMilner24Douglas
4AmyCooze73Boston
  1. # 为 df.city 中的每个独特的类别创建虚拟变量
  2. pd.get_dummies(df["city"])
BaltimoreBostonDouglasMiamiSan Francisco
00.00.00.00.01.0
11.00.00.00.00.0
20.00.00.01.00.0
30.00.01.00.00.0
40.01.00.00.00.0
  1. # 将字符串类别变量转换为整数
  2. integerized_data = preprocessing.LabelEncoder().fit_transform(df["city"])
  3. # 查看数据
  4. integerized_data
  5. # array([4, 0, 3, 2, 1])
  6. # 将整数类别表示为独热编码
  7. preprocessing.OneHotEncoder().fit_transform(integerized_data.reshape(-1,1)).toarray()
  8. '''
  9. array([[ 0., 0., 0., 0., 1.],
  10. [ 1., 0., 0., 0., 0.],
  11. [ 0., 0., 0., 1., 0.],
  12. [ 0., 0., 1., 0., 0.],
  13. [ 0., 1., 0., 0., 0.]])
  14. '''

请注意,pd.get_dummies()和 scikit 方法的输出会生成相同的输出矩阵。

预处理鸢尾花数据

  1. from sklearn import datasets
  2. import numpy as np
  3. from sklearn.cross_validation import train_test_split
  4. from sklearn.preprocessing import StandardScaler
  5. # 加载鸢尾花数据
  6. iris = datasets.load_iris()
  7. # 为特征数据创建变量
  8. X = iris.data
  9. # 为目标数据创建标签
  10. y = iris.target
  11. # 随机将数据分成四个新数据集,训练特征,训练结果,测试特征,
  12. # 和测试结果。 将测试数据的大小设置为完整数据集的 30%。
  13. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
  14. # 加载标准化缩放器
  15. sc = StandardScaler()
  16. # 基于训练数据计算均值和标准差
  17. sc.fit(X_train)
  18. # 将训练数据缩放为均值 0 和单位标准差
  19. X_train_std = sc.transform(X_train)
  20. # 将测试数据缩放为均值 0 和单位标准差
  21. X_test_std = sc.transform(X_test)
  22. # 测试数据的特征,非标准化
  23. X_test[0:5]
  24. '''
  25. array([[ 6.1, 2.8, 4.7, 1.2],
  26. [ 5.7, 3.8, 1.7, 0.3],
  27. [ 7.7, 2.6, 6.9, 2.3],
  28. [ 6. , 2.9, 4.5, 1.5],
  29. [ 6.8, 2.8, 4.8, 1.4]])
  30. '''
  31. # 测试数据的特征,标准化
  32. X_test_std[0:5]
  33. '''
  34. array([[ 0.3100623 , -0.49582097, 0.48403749, -0.05143998],
  35. [-0.17225683, 1.92563026, -1.26851205, -1.26670948],
  36. [ 2.23933883, -0.98011121, 1.76924049, 1.43388941],
  37. [ 0.18948252, -0.25367584, 0.36720086, 0.35364985],
  38. [ 1.15412078, -0.49582097, 0.54245581, 0.21861991]])
  39. '''

特征重缩放

三、数据预处理 - 图6

  1. # 加载库
  2. from sklearn import preprocessing
  3. import numpy as np
  4. # 创建特征
  5. x = np.array([[-500.5],
  6. [-100.1],
  7. [0],
  8. [100.1],
  9. [900.9]])
  10. # 创建缩放器
  11. minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1))
  12. # 缩放特征
  13. x_scale = minmax_scale.fit_transform(x)
  14. # 展示特征
  15. x_scale
  16. '''
  17. array([[ 0. ],
  18. [ 0.28571429],
  19. [ 0.35714286],
  20. [ 0.42857143],
  21. [ 1. ]])
  22. '''

标准化特征

三、数据预处理 - 图7

  1. # 加载库
  2. from sklearn import preprocessing
  3. import numpy as np
  4. # 创建特征
  5. x = np.array([[-500.5],
  6. [-100.1],
  7. [0],
  8. [100.1],
  9. [900.9]])
  10. # 创建缩放器
  11. scaler = preprocessing.StandardScaler()
  12. # 转换特征
  13. standardized = scaler.fit_transform(x)
  14. # 展示特征
  15. standardized
  16. '''
  17. array([[ 0. ],
  18. [ 0.28571429],
  19. [ 0.35714286],
  20. [ 0.42857143],
  21. [ 1. ]])
  22. '''