什么是机器学习机器学习是一门能够让编程计算机从数据中学习的计算机科学。 一个计算机程序在完成任务T之后,获得经验E,其表现效果为P,如果任务T的性能表现,也就是用以衡量的P,随着E增加而增加,那么这样计算机程序就被称为机器学习系统。 自我完善,自我增进,自我适应。 为什么需要机器学习
机器学习的问题
机器学习的种类监督学习、无监督学习、半监督学习、强化学习
批量学习和增量学习
基于实例的学习和基于模型的学习 1.根据以往的经验,寻找与待预测输入最接近的样本,以其输出作为预测结果。
2.基于模型的学习:根据以往的经验,建立用于联系输出和输入的某种数学模型,将待预测输入代入该模型,预测其结果。 输入 -> 输出 1 2 2 4 3 6Y = 2 * X ... 9 ? -> 18 机器学习的一般过程数据处理
机器学习
业务运维
机器学习的典型应用股价预测、推荐引擎、自然语言识别、语音识别、图像识别、人脸识别 机器学习的基本问题1)回归问题:根据已知的输入和输出寻找某种性能最佳的模型,将未知输出的输入代入模型,得到连续的输出。 2)分类问题:根据已知的输入和输出寻找某种性能最佳的模型,将未知输出的输入代入模型,得到离散的输出。 3)聚类问题:根据已知输入的相似程度,将其划分为不同的群落。 4)降维问题:在性能损失尽可能小的前提下,降低数据的复杂度。 数据预处理异常值修正或缺失值填补的方式很多,随机数,插值等.如果某一列异常值或缺失值过多,不建议将这一列添加到训练样本数据内 数据清洗过后,需要数据预处理猜可以训练模型. 数据预处理的过程: 输入数据 -> 模型 -> 输出数据 数据样本矩阵
一行一样本,一列一特征。 数据预处理相关库 # 解决机器学习问题的科学计算工具包 import sklearn.preprocessing as sp 均值移除(标准化)由于一个样本的不同特征值差异较大,不利于使用现有机器学习算法进行样本处理。均值移除可以让样本矩阵中的每一列的平均值为0,标准差为1。 如何使样本矩阵中的每一列的平均值为0呢? 例如有一列特征值表示年龄: 17, 20, 23 mean = (17 20 23)/3 = 20 a' = -3 b' = 0 c' = 3 完成! 如何使样本矩阵中的每一列的标准差为1呢? a' = -3 b' = 0 c' = 3 s' = std(a', b', c') [a'/s', b'/s', c'/s'] 均值移除API: import sklearn.preprocessing as sp # scale函数用于对函数进行预处理,实现均值移除。 # array为原数组,返回A为均值移除后的结果。 A = sp.scale(array) 案例: import numpy as np import sklearn.preprocessing as sp raw_samples = np.array([ [17., 100., 4000], [20., 80., 5000], [23., 75., 5500]]) print(raw_samples) mms_samples = raw_samples.copy() for col in mms_samples.T: col_min = col.min() col_max = col.max() a = np.array([ [col_min, 1], [col_max, 1]]) b = np.array([0, 1]) x = np.linalg.solve(a, b) col *= x[0] col = x[1] print(mms_samples) # 根据给定范围创建一个范围缩放器 mms = sp.MinMaxScaler(feature_range=(0, 1)) # 用范围缩放器实现特征值的范围缩放 mms_samples = mms.fit_transform(raw_samples) print(mms_samples) 归一化有些情况每个样本的每个特征值具体的值并不重要,但是每个样本特征值的占比更加重要。
所以归一化即是用每个样本的每个特征值除以该样本各个特征值绝对值的总和。变换后的样本矩阵,每个样本的特征值绝对值之和为1。 归一化相关API: # array 原始样本矩阵 # norm 范数 # l1 - l1范数,向量中个元素绝对值之和 # l2 - l2范数,向量中个元素平方之和 # 返回归一化预处理后的样本矩阵 sp.normalize(array, norm='l1') 案例: import numpy as np import sklearn.preprocessing as sp raw_samples = np.array([ [17., 100., 4000], [20., 80., 5000], [23., 75., 5500]]) print(raw_samples) nor_samples = raw_samples.copy() for row in nor_samples: row /= abs(row).sum() print(nor_samples) print(abs(nor_samples).sum(axis=1)) # 归一化预处理 nor_samples = sp.normalize(raw_samples, norm='l1') print(nor_samples) print(abs(nor_samples).sum(axis=1)) 二值化有些业务并不需要分析矩阵的详细完整数据(比如图像边缘识别只需要分析出图像边缘即可),可以根据一个事先给定的阈值,用0和1表示特征值不高于或高于阈值。二值化后的数组中每个元素非0即1,达到简化数学模型的目的。 二值化相关API: # 给出阈值, 获取二值化器 bin = sp.Binarizer(threshold=阈值) # 调用transform方法对原始样本矩阵进行二值化预处理操作 result = bin.transform(原始样本矩阵) 案例: import numpy as np import sklearn.preprocessing as sp raw_samples = np.array([ [17., 100., 4000], [20., 80., 5000], [23., 75., 5500]]) print(raw_samples) bin_samples = raw_samples.copy() bin_samples[bin_samples <= 80] = 0 bin_samples[bin_samples > 80] = 1 print(bin_samples) # 根据给定的阈值创建一个二值化器 bin = sp.Binarizer(threshold=80) # 通过二值化器进行二值化预处理 bin_samples = bin.transform(raw_samples) print(bin_samples) 独热编码为样本特征的每个值建立一个由一个1和若干个0组成的序列,用该序列对所有的特征值进行编码。 两个数 三个数 四个数 1 3 2 7 5 4 1 8 6 7 3 9 为每一个数字进行独热编码: 1-10 3-100 2-1000 7-01 5-010 4-0100 8-001 6-0010 9-0001 编码完毕后得到最终经过独热编码后的样本矩阵: 101001000 010100100 100010010 011000001 独热编码相关API: # 创建一个独热编码器 # sparse: 是否使用紧缩格式(稀疏矩阵) # dtyle: 数据类型 ohe = sp.OneHotEncoder(sparse=是否采用紧缩格式, dtype=数据类型) # 对原始样本矩阵进行处理,返回独热编码后的样本矩阵。 result = ohe.fit_transform(原始样本矩阵) ohe = sp.OneHotEncoder(sparse=是否采用紧缩格式, dtype=数据类型) # 对原始样本矩阵进行训练,得到编码字典 encode_dict = ohe.fit(原始样本矩阵) # 调用encode_dict字典的transform方法 对数据样本矩阵进行独热编码 result = encode_dict.transform(原始样本矩阵) 案例: import numpy as np import sklearn.preprocessing as sp raw_samples = np.array([ [17., 100., 4000], [20., 80., 5000], [23., 75., 5500]]) # 创建独热编码器 ohe = sp.OneHotEncoder(sparse=False, dtype=int) # 用独特编码器对原始样本矩阵做独热编码 ohe_dict = ohe.fit(raw_samples) ohe_samples = ohe_dict.transform(raw_samples) ohe_samples = ohe.fit_transform(raw_samples) print(ohe_samples) 标签编码根据字符串形式的特征值在特征序列中的位置,为其指定一个数字标签,用于提供给基于数值算法的学习模型。 标签编码相关API: # 获取标签编码器 lbe = sp.LabelEncoder() # 调用标签编码器的fit_transform方法训练并且为原始样本矩阵进行标签编码 result = lbe.fit_transform(原始样本矩阵) # 根据标签编码的结果矩阵反查字典 得到原始数据矩阵 samples = lbe.inverse_transform(result) 案例: import numpy as np import sklearn.preprocessing as sp 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) inv_samples = lbe.inverse_transform(lbe_samples) print(inv_samples) 标签编码根据字符串形式的特征值在特征序列中的位置,为其指定一个数字标签,用于提供给基于数值算法的学习模型。 标签编码相关API: # 获取标签编码器 lbe = sp.LabelEncoder() # 调用标签编码器的fit_transform方法训练并且为原始样本矩阵进行标签编码 result = lbe.fit_transform(原始样本矩阵) # 根据标签编码的结果矩阵反查字典 得到原始数据矩阵 samples = lbe.inverse_transform(result) 案例: import numpy as np import sklearn.preprocessing as sp 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) inv_samples = lbe.inverse_transform(lbe_samples) print(inv_samples) |
|