数据预处理和特征工程

1.无量纲化:
当数据量纲不一致时需要进行归一化处理,有两种方法:
最值归一化(normalization): 把所有数据映射到0-1之间。最值归一化的使用范围是特征的分布具有明显边界的(分数0~100分、灰度0~255),受outlier的影响比较大;
均值方差归一化(standardization): 把所有数据归一到均值为0方差为1的分布中。适用于数据中没有明显的边界,有可能存在极端数据值的情况.

代码实现:

#最值归一化
import numpy as np
# 创建100个随机数
x = np.random.randint(0,100,size=100)

# 最值归一化(向量)
# 最值归一化公式,映射到0,1之间
(x - np.min(x)) / (np.max(x) -  np.min(x))

# 最值归一化(矩阵)
# 0~100范围内的50*2的矩阵
X = np.random.randint(0,100,(50,2))
# 将矩阵改为浮点型
X = np.array(X, dtype=float)
# 最值归一化公式,对于每一个维度(列方向)进行归一化。
# X[:,0]第一列,第一个特征
X[:,0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))
# X[:,1]第二列,第二个特征
X[:,1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))

# 如果有n个特征,可以写个循环:
for i in range(0,2):
    X[:,i] = (X[:,i]-np.min(X[:,i])) / (np.max(X[:,i] - np.min(X[:,i])))

import matplotlib.pyplot as plt
plt.scatter(X[:,0],X[:,1])
plt.show()
#均值方差归一化实现
X2 = np.array(np.random.randint(0,100,(50,2)),dtype=float)

# 套用公式,对每一列做均值方差归一化
for i in range(0,2):
    X2[:,i]=(X2[:,i]-np.mean(X2[:,i])) / np.std(X2[:,i])
plt.scatter(X2[:,0],X2[:,1])
plt.show()

np.mean(X2[:,0])
np.std(X2[:,1])
#Sklearn中的归一化
在sklearn中用来数据归一化的方法:StandardScaler。

#加载鸢尾花数据集
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=666)

#数据归一化

from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
# 归一化的过程跟训练模型一样
standardScaler.fit(X_train)
standardScaler.mean_
standardScaler.scale_   # 表述数据分布范围的变量,替代std_

# 使用transform
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)

注意:在建模时要将数据集划分为训练数据集&测试数据集,训练数据集进行归一化处理,需要计算出训练数据集的均值mean_train和方差std_train,在对测试数据集进行归一化时,仍然要使用训练数据集的均值train_mean和方差std_train。

2.缺失值处理
遇到数据缺失的情况一般是进行填补:可以用均值和众数中位数等进行填补

用Pandas和Numpy进行填补
import pandas as pd
data = pd.read_csv(r"...data.csv",index_col=0)
data.head()

data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
#.fillna 在DataFrame里面直接进行填补
​
data.dropna(axis=0,inplace=True)
#.dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
#参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False

3.处理分类型特征
在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据,这是需要将数字型数据转换成数值型。

#preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值

from sklearn.preprocessing import LabelEncoder
​
y = data.iloc[:,-1]                         #要输入的是标签,不是特征矩阵,所以允许一维
​
le = LabelEncoder()                         #实例化
le = le.fit(y)                              #导入数据
label = le.transform(y)                     #transform接口调取结果
​
le.classes_                                 #属性.classes_查看标签中究竟有多少类别
label                                       #查看获取的结果label
​
le.fit_transform(y)                         #也可以直接fit_transform一步到位
​
le.inverse_transform(label)                 #使用inverse_transform可以逆转
​
data.iloc[:,-1] = label                     #让标签等于我们运行出来的结果
​
data.head()

​或
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])


#preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值

from sklearn.preprocessing import OrdinalEncoder
​
#接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()
​
data_.head()
​
OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_
​
data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])
​
data_.head()

4.处理连续型特征
#二值化
sklearn.preprocessing.Binarizer
  根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1。

data_2 = data.copy()
​
from sklearn.preprocessing import Binarizer
X = data_2.iloc[:,0].values.reshape(-1,1)               #类为特征专用,所以不能使用一维数组
transformer = Binarizer(threshold=30).fit_transform(X)
​
transformer

参考:https://www.cnblogs.com/juanjiang/archive/2019/05/30/10948849.html
https://mp.weixin.qq.com/s/RkenakI_DSXoMLwNNvUAAw

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值