基于https://www.bilibili.com/video/BV1CB4y1c7UQ?p=9&spm_id_from=pageDriver
#问题分类:回归(函数输出),分类,聚类(根据相似度划分成不同的群落),降维(降低数据复杂度)
#数据预处理:将字符串转为数值,将数据归一化(避免最后的过度拟合)
#1.标准化
#均值移除:一个样本的不同特征差异可能较大,不利于机器学习算法惊样本处理
#将样本化为均值为0,标准差为1的数据集
#均值为0算法:1.求平均值 2.每个分量减去平均值
#标准差为1算法:转为均值为0的数据集后,每个分量再除去标准差
#使用API:通过sklearn。preprocessing快速解决
#应用例子(用sp.scale())
import numpy as np
import sklearn.preprocessing as sp
raw_samples=np.array([
[17,90,4000],
[20,80,5000],
[23,75,6000]
])
result=sp.scale(raw_samples)
#.mean(axis=), .std(axis=)可以分别算出品均值与标准差
#print(result)
#范围缩放API sp.MinMaxScaler(feature_range=(a,b))
#主义这是定义了一个转换的方法或者说函数,后面应该要输入内容
#print(raw_samples)
mms=sp.MinMaxScaler(feature_range=(0,1))
raw_samples=mms.fit_transform(raw_samples)
#print(raw_samples)
#print('----')
#可见是针对一列列的来缩放
#part_2 解线性函数
#用了 np.linalg.solve(a,b) 雷明那本书上有
# .T 可以直接得到矩阵的转置
raw_samples=np.array([
[17,90,4000],
[20,80,5000],
[23,75,6000]
])
mms_samples=raw_samples.copy()
new_samples=[]
#这里是缩放
for row in mms_samples.T:
min_val=row.min()
max_val=row.max()
#kx+b=0 or 1
A=np.array([[min_val,1],[max_val,1]])
B=np.array([0,1])
x=np.linalg.solve(A,B)
#x 两行一列
#最后输出到屏幕上的应该是转置后的结果
new_row=row*x[0]+x[1]
new_samples.append(new_row)
#print(np.array(new_samples).T)
#part_3 归一化
# norm 范数
# l1 -l1范数:向量中元素的绝对值之和
# l2 -l2范数:向量中每个元素的平方和
#用 sp.normalize(matrix,norm='')
raw_samples=np.array([
[17,90,4000],
[20,80,5000],
[23,75,6000]
])
#太难看了,转置效果好看点
result=sp.normalize(raw_samples.T, norm='l1')
#print(result)
#part4 二值化
#根据一个事先给定的阈值,用0和1表示特征值不高于或高于阈值。二值化后的数组中每个元素非0即1
#给出阈值, 获取二值化器
#bin = sp.Binarizer(threshold=阈值)
# 调用transform方法对原始样本矩阵进行二值化预处理操作
#result = bin.transform(原始样本矩阵)
raw_samples=np.array([
[17,90,4000],
[20,80,5000],
[23,75,6000]
])
bin=sp.Binarizer(threshold=80)
result=bin.transform(raw_samples)
#print(result)
#part5 独热编码(one-hot encoding)
#编码原则:找出每一列的离散值,有几个就有几位编码,只有一位为1,其他为0
#比如,某一列有 1,3,5,则它们三个的one-hot encoding分别为100,010,001
#再如,某一列有1,4,6,8,9.则分别为10000,01000,00100,00010,00001
#方法:创建一个独热编码器
# sparse: 是否使用紧缩格式(稀疏矩阵),如果选用 sparse=True,会返回标记为的位置
# dtyle: 数据类型
#ohe = sp.OneHotEncoder(sparse=是否采用紧缩格式, dtype=数据类型)
# 对原始样本矩阵进行处理,返回独热编码后的样本矩阵。
#result = ohe.fit_transform(原始样本矩阵)
#
raw_samples=np.array([
[1,9,4],
[2,0,5],
[2,7,6],
[1,0,7]
])
ohe=sp.OneHotEncoder(sparse=False,dtype='int8')
result=ohe.fit_transform(raw_samples)
print(result)
#part5 标签编码
#就是把文字标签(字符串)转化为数字标签,
#实际上感觉和独热编码没差多少
#但是这个比较鶸,建议自己写一个类,
#方法:
# 获取标签编码器
#lbe = sp.LabelEncoder()
# 调用标签编码器的fit_transform方法训练并且为原始样本矩阵进行标签编码
#result = lbe.fit_transform(原始样本矩阵)
# 根据标签编码的结果矩阵反查字典 得到原始数据矩阵
#samples = lbe.inverse_transform(result)
raw_samples = np.array([
'audi', 'ford', 'audi', 'toyota',
'ford', 'bmw', 'toyota', 'ford',
'audi'])
print(raw_samples)
lbe = sp.LabelEncoder()
lbe_samples = lbe.fit_transform(raw_samples)
print(lbe_samples)
lbe_samples=([2,1,2,2,3,0,0,1])
inv_samples = lbe.inverse_transform(lbe_samples)
print(inv_samples)