机器学习入门笔记03:特征预处理

目标

  • 简单的数据处理和特征工程
  • 最值归一化
  • 均值方差归一化
  • 数值型特征特征分箱(数据离散化)
  • 二值化

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)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容