python机器学习--数据预处理API

均值移除(将标准差变为1)

由于一个样本的不同特征值差异较大,不利于使用现有机器学习算法进行样本处理。均值移除可以让样本矩阵中的每一列的平均值为0,标准差为1。

import sklearn.preprocessing as sp
import numpy as np
# scale函数用于对函数进行预处理,实现均值移除。
# array为原数组,返回A为均值移除后的结果。

#将列表转为 ndarray对象
raw_samples = np.array([
		[17., 100., 4000],
		[20., 80., 5000],
		[23., 75., 5500]])

#均值移除API,使每一列均值为0,标准差为1
A = sp.scale(array)
print(r)
print(r.mean(axis=0))	#均值,垂直方向求
print(r.std(axis=0)	#标准差,垂直方向求

范围缩放

将样本矩阵中的每一列的最小值和最大值设定为相同的区间,统一各列特征值的范围。一般情况下会把特征值缩放至[0, 1]区间。
适用于之后算法对数据原样本精度不敏感的情况(这个方法会造成数据破坏)

范围缩放API

import sklearn.preprocessing as sp
import numpy as np

raw_samples = np.array([
		[17., 100., 4000],
		[20., 80., 5000],
		[23., 75., 5500]])
		
#创建MinMax缩放器		
mms = sp.MinMaxScaler(feature_range=(0, 1))		#指定缩放到区间[0,1]
#调用mms对象的方法执行缩放操作, 返回缩放过后的结果
result = mms.fit_transform(raw_samples)

自己实现范围缩放的算法

raw_samples = np.array([
		 [17., 100., 4000],
		 [20., 80., 5000],
		 [23., 75., 5500]])
		 
cols = raw_samples.shape[1]	#shape[1]获取列数
r = []
#遍历每一列
for i in range(cols):
	col_val = raw_samples[:,i]	#循环索引三维数组的每一列出来
	#将每一列的数据映射到0~1之间,并通过lstsq()函数求得该列的线型函数的k与b
	A = np.array([[col_val.min(),1],
		     [col_val.max(),1]])
	B = np.array([[0],[1]])	   
	x = np.linalg.lstsq(A,B)[0]	#x为得到的一元二次方程的系数
	#计算缩放到0~1间后的数据结果
	r.append(col_val * x[0] + x[1])	#col_val代表着原ndarray的每一列,但是切出来后存储结构是行,append添加之后需要转置回列
	print(np.array(r).T)	#T转置

归一化

有些情况每个样本的每个特征值具体的值并不重要,但是每个样本特征值的占比更加重要。
所以归一化即是用每个样本的每个特征值除以该样本各个特征值绝对值的总和。变换后的样本矩阵,每个样本的特征值绝对值之和为1。
特点:对行进行操作

import sklearn.preprocessing as sp

#API
sp.normalize(array,norm='l1')
#参数:array原始样本矩阵,norm范数:l1代表向量中各元素绝对值之和归一,l2代表向量中各元素平方和归一

二值化

有些业务并不需要分析矩阵的详细完整数据(比如图像边缘识别只需要分析出图像边缘即可),可以根据一个事先给定的阈值,用0和1表示特征值不高于或高于阈值。二值化后的数组中每个元素非0即1,达到简化数学模型的目的。

#API
#给出阈值,获取二值化器
bin = sp.Binarizer(threshold=阈值)
#调用transform方法对原始样本矩阵进行二值化预处理操作
result = bin.transform(原始样本矩阵)

案例

import sklearn.preprocessing as sp
import scipy.misc as sm
import matplotlib.pyplot as mp

#以灰度模式打开图片
img = sm.imread('../da_data/lily.jpg',True)
print(img.shape)

#创建子图窗口:窗口数为1行2列
#操作第一个窗口
mp.subplot(121)

#在第一个窗口绘制热成像图,颜色映射条选择gray
mp.imshow(img,cmap='gray')
#紧凑打开窗口
mp.tight_layout()

#获取二值化器,并给出阈值(选择中间)
bin = sp.Binarizer(threshold=127)
#调用transform方法对原始样本矩阵进行二值化预处理操作
img2 = bin.transform(img)
#将当前窗口切换到2号窗口,对2好窗口进行操作
mp.subplot(122)
#绘制热成像图,颜色银蛇条选择gray
mp.imshow(img2,camp='gray')
mp.tight_layout()

#显示图像
mp.show()

独热编码

目的:将不好处理的离散值编成好处理的数字
方法:将样本的每个值改为一个1和若干个0组成的序列
优点:把整个样本数据变成非0即1的数据,会对某些算法有性能上的提升

API
#创建一个独热编码器
#sparse:是否使用紧缩格式(稀疏矩阵),稀疏矩阵只存储在哪些位置为1,节省内存空间
#dtyle:  数据类型
ohe = sp.OneHotEncoder(sparse=是否采用稀疏矩阵, dtype=数据类型)
# 对原始样本矩阵进行处理,返回独热编码后的样本矩阵。
result = ohe.fit_transform(原始样本矩阵)
print(r,type(r))	#输出的数据为稀疏矩阵:(x,x) 1.0   表示元组中数值对应下标位置是1,其他下标位置是0,这样可以节省内存空间
print(r.toarray(())	#输出详细的生成的独热编码

标签编码

给字符串指定数(指定的数的大小可以根据具体业务进行选择),不同的数字对应不同的字符串
示例

import numpy as np
import sklearn.preprocessing as sp

#给出原始数据样本
samples = ['Audi','Bmw','Benz','Bmw','Audi','Toyota']

#获取标签编码器
lbe = sp.LabelEncoder()
#调用标签编码器的fit_transform方法训练并且为原始样本矩阵进行标签编码
result = lbe.fit_transform(原始样本特征数组)
print(r)

#假设通过模型预测后得到一组预测结果
pred = [0, 1, 2, 3, 4, 3, 2, 1]
#根据标签编码的结果对该预测结果反编码,获得对应的座驾
samples = lbe.inverse_transform(result)

线性回归

通过已知的输入和输出,求得最优的线性方程,使用这个线性方程来解决回归问题的模型就是线性回归模型

预测函数:y = w0 + w1x
x:输入
y:输出
w0和w1:模型参数

所谓模型训练,就是根据已知的x和y,找到最佳的模型参数w0 和 w1,尽可能精确地描述出输入和输出的关系。

概念:
单样本误差:根据预测函数求出输入为x时的预测值:y’ = w0 + w1x,单样本误差为1/2(y’ - y)2
总样本误差(所有单样本误差相加即是总样本误差):1/2 Σ(y’ - y)2

我们的目标就是将总样本误差降到最小,通过损失函数(损失函数九四总样本误差关于模型参数的函数,改函数属于三维数学模型,即需要找到一组w0 w1使得loss取极小值)来求
损失函数:loss = 1/2 Σ(w0 + w1x - y)2,x输入和y输出是已知的
这样就将问题转化为loss最小(图像中的最低点)时的w0和w1

偏w0方向的导函数(将w1看成常数时):Σ( w0 + w1x - y)
偏w1方向的导函数(将w0看成常数时):Σ(x(xw1 + w0 - y))

import matplotlib.pyplot as mp
from mpl_toolkits.mplot3d import axes3d

n = 500
#生成网格化坐标矩阵,w0和w1的shape为(500,500),w0轴范围0~9,w1轴范围0~3.5
w0,w1 = np.meshgrid(np.linspace(0,9,n),np.linspace(0,3.5,n))

#计算损失值矩阵
#输入x
xs = np.array([0.5,0.6,0.8,1.1,1.4])
#输出y
ys = np.array([5.0,5.5,6.0,6.8,7.0])

#损失函数
#做一个接收误差值的容器(就是loss),shape需要和w0一样为(500,500),loss中每一个元素记录的都是总样本误差
loss = np.zeros_like(w0)
#通过for循环求总样本误差
for x ,y in zip(xs,ys):	#zip将xs和ys打包成:[(0.5,5.0),(0.6,5.5)...]
	#累加单样本误差,ndarray求和是所有元素都加该值
	loss += (w0 + w1 * x -y)**2 / 2

#画图
mp.figure('loss function',facecolor='lightgray')
#创建3d坐标轴
ax3d = mp.gca(projection='3d')
#给每个轴添加标签文本
ax3d.et_xlabel('w0')
ax3d.et_ylabel('w1')
ax3d.et_xlabel('z')

#创建三维平面图,w0,w1,loss都为2维度数组,rstride为行跨距,cstride为列跨距
ax3d.plot_surface(w0,w1,loss,rstride=30,cstride=20,cmap='jet')
mp.tight_layout()
mp.show()

#找生成的三维图形的最低点,最低点所对应的w02和w1就是预测函数的最佳系数
#梯度下降:随意找一个点,试图从当前这个点不断的向下(即该点的x轴对应值向左移动):x1 = x0 - lrate*y',lrate为学习率,掌管这个点下降的速度
#这是个三维图形,需要求偏导(偏w0方向和偏w1方向)
#设置下降次数(for循环迭代次数)
times = 1000
#定初始点偏w0方向和偏w1方向的横坐标值
w0,w1 = 1,1
#自己定一个合适的学习率
lrate = 0.01
for i in range(1,times + 1)
	#计算w0方向上的偏导数
	d0 = (w0 + w1 * xs - ys).sum()
	#计算w1方向上的偏导数
	d1 = (xs * (w0 + w1 * xs - ys)).sum()
	#让w0与w1随着for循环不断更新,迭代到最后的得到的w0和w1会基本保持不变,此时基本就是最低点
	w0 = w0 - lrate * d0
	w1 = w1 - lrate * d1

#画图显示效果
mp.figure('Linear Regression',facecolor='lightgray')
mp.title('Linear Regression',fontsize=18)
mp.grid(linestyle=':')

#在图表中绘制出数据样本(通过绘制特殊点的方式)
mp.scatter(xs,ys,s=80,color='dodgerblue',label='Samples')	#label为图例中显示的线条的名字(不设置图例不饿能使用)

#通过w0与w1绘制回归线(最佳拟合线)
pred_y = w0 + w1 *xs
mp.plot(xs,pred_y,color='orangered',label='Regression Line')
#显示图例
mp.legend()
mp.show()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值