目标
- 简单的数据处理和特征工程
- 最值归一化
- 均值方差归一化
- 数值型特征特征分箱(数据离散化)
- 二值化
1. 最值归一化
#!/usr/bin/env python3
# 最值归一化(矩阵)
# 0~100范围内的50*2的矩阵
X = np.array(np.random.randint(0, 100, (50, 2)), dtype=float)
print(X)
# 如果有n个特征,可以写个循环:
for i in range(0,2):
X[:, i] = (X[:, i]-np.min(X[:, i])) / (np.max(X[:, i] - np.min(X[:, i])))
print(X)
# 计算其均值/方差
X_mean = np.mean(X[:, 1])
X_std = np.std(X[:, 1])
print(X_mean, X_std)
# 简单绘制样本,看横纵坐标
plt.scatter(X[:, 0], X[:, 1])
plt.show()
2. 使用sklearn实现
#!/usr/bin/env python3
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)
standardScaler = StandardScaler()
# 归一化的过程跟训练模型一样
standardScaler.fit(X_train)
print(standardScaler.mean_)
print(standardScaler.scale_) # 表述数据分布范围的变量,替代std_
# 使用transform
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)
# MeanStd标准化
from sklearn.preprocessing import StandardScaler
# 标准化,返回值为标准化后的数据
standardScaler = StandardScaler().fit(X_train)
standardScaler.transform(X_train)
# MinMax归一化
from sklearn.preprocessing import MinMaxScaler
# 区间缩放,返回值为缩放到[0, 1]区间的数据
minMaxScaler = MinMaxScaler().fit(X_train)
minMaxScaler.transform(X_train)
# 正态分布化
from sklearn.preprocessing import Normalizer
# 归一化,返回值为归一化后的数据
normalizer = Normalizer(norm='l2').fit(X_train)
normalizer.transform(X_train)
3. 数值型特征特征分箱(数据离散化)
#!/usr/bin/env python3
# 等距分箱
import pandas as pd
df = pd.DataFrame([[22, 1], [13, 1], [33, 1], [52, 0], [16, 0], [42, 1], [53, 1], [39, 1], [26, 0], [66, 0]], columns=['age', 'Y'])
df['age_bin_2'] = pd.cut(df['age'], 3) # 新增一列存储等距划分的分箱特征
print(df)
# 聚类分箱
from sklearn.cluster import KMeans
data = np.array(df.age)
k = 3
kmodel = KMeans(n_clusters=k) # k为聚成几类
kmodel.fit(data.reshape(len(data), 1)) # 训练模型
c = pd.DataFrame(kmodel.cluster_centers_, columns=['age']) # 求聚类中心
c = c.sort_values(by='age') # 排序
w = pd.rolling_mean(c, 2).iloc[1:] # 用滑动窗口求均值的方法求相邻两项求中点,作为边界点
w = [0] + list(w[0] + [data.max()]) # 把首末边界点加上
d3 = pd.cut(data, w, labels=range(k)) # cut函数
# 二值化
from sklearn.preprocessing import Binarizer
# Binarizer函数也可以设定一个阈值,结果数据值大于阈值的为1,小于阈值的为0
binarizer = Binarizer(threshold=0.0).fit(X_train)
binarizer.transform(X_train)