机器学习开发流程
- 1.数据采集
- 公司内部产生的数据
- 和其他公司合作获取的数据
- 购买的数据
- 2.分析数据所对应要解决需求或者问题是什么?根据目标数据推断问题属于回归还是分类!
- 3.数据的基本处理
- 4.特征工程:对特征进行处理
- 5.选择合适的模型,然后对其进行训练
- 6.模型的评估
- 7.上线使用
特征工程
首要的任务是机器学习前的数据处理部分,这里讲解构建特征工程
字符串特征化
字符串数据尽量转换为数值型的数据,这里的工具采用sk-learn
one hot编码
from sklearn.feature_extraction import DictVectorizer
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d = DictVectorizer(sparse=False)
result = d.fit_transform(alist)
names = d.get_feature_names()
print(names)
print(result)
结果:
[[ 1. 0. 0. 33.]
[ 0. 1. 0. 42.]
[ 0. 0. 1. 40.]]
OneHot编码
- sparse矩阵中的0and1就是onehot编码
基于pandas实现独热编码(Onehot编码)
import pandas as pd
df = pd.DataFrame([
['green', 'M', 20, 'class1'],
['red', 'L', 21, 'class2'],
['blue', 'XL',30, 'class3']])
df.columns = ['color', 'size', 'weight', 'class label']
r1 = pd.get_dummies(df['color'])
new_df = pd.concat((df,r1),axis=1).drop(labels='color',axis=1)
new_df['new_size'] = new_df['size'].map({'M':1,'L':2,'XL':3})
new_df = new_df.drop(labels='size',axis=1)
文本特征化
- 作用:对文本数据进行特征值化
- API:from sklearn.feature_extraction.text import CountVectorizer
- fit_transform(X):X为文本或者包含文本字符串的可迭代对象,返回sparse矩阵
- inverse_transform(X):X为array数组或者sparse矩阵,返回转换之前的格式数据
- get_feature_names()
- toarray():将sparse矩阵换成数组
from sklearn.feature_extraction.text import CountVectorizer
alist = [
'left is is short,i love python',
'left is too long,i hate python'
]
c = CountVectorizer()
result = c.fit_transform(alist)
print(c.get_feature_names())
print(result.toarray())
结果:每个单词出现的次数,一个字母的不计数
['hate', 'is', 'left', 'long', 'love', 'python', 'short', 'too']
[[0 2 1 0 1 1 1 0]
[1 1 1 1 0 1 0 1]]
jieba分词
没有包需要导入:pip install jieba
为什么需要引入jieba分词,是因为文本识别只能对符合和空格分隔,一段文字不能分开
import jieba
from sklearn.feature_extraction.text import CountVectorizer
text = [
'因为在自然语言处理中,我们是需要将一段中文文本中相关的词语,成语,形容词......都要进行抽取的',
'目前CountVectorizer只可以对有标点符号和用分隔符对应的文本进行特征抽取,显然这是满足不了我们日常需求的'
]
new_text = []
for t in text:
r = list(jieba.cut(t))
s = ' '.join(r)
new_text.append(s)
c = CountVectorizer()
result = c.fit_transform(new_text)
print(c.get_feature_names())
print(result.toarray())
数值型数据预处理
- 无量纲化:
- 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求这种需求统称为将数据“无量纲化”。
- 譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经 网络,无量纲化可以加快求解速度;
- 而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。
- 一个特例是决策树和树的集成算法们,对决策 树我们不需要无量纲化,决策树可以把任意数据都处理得很好。
- 那么预处理就是用来实现无量纲化的方式。
- 含义:特征抽取后我们就可以获取对应的数值型的样本数据啦,然后就可以进行数据处理了。
- 概念:通过特定的统计方法(数学方法),将数据转换成算法要求的数据
- 方式:
归一化
如果认为每一个特征具有同等大小的权重都同等重要,则必须要对其进行归一化处理。
通过对原始数据进行变换将数据映射到0-1之间(默认),归一化后的数据服从正态分布
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
result = mm.fit_transform(feature)
print(result)
- 问题:如果数据中存在的异常值比较多,会对结果造成什么样的影响?
- 结合着归一化计算的公式可知,异常值对原始特征中的最大值和最小值的影响很大,因此也会影响对归一化之后的值。这个也是归一化的一个弊端,无法很好的处理异常值。
- 归一化总结:
- 在特定场景下最大值和最小值是变化的,另外最大最小值很容易受到异常值的影响,所以这种归一化的方式具有一定的局限性。因此引出了一种更好的方式叫做:标准化!!!
标准化
-
标准化的处理
-
API
- 处理后,每列所有的数据都聚集在均值为0,标准差为1范围附近
- 标准化API:from sklearn.preprocessing import StandardScaler
- fit_transform(X):对X进行标准化
- mean_:均值
- var_:方差
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
result = s.fit_transform(feature)
print(result)
特征选择
Filter过滤式(方差过滤)
- 原理:这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。所以无论接下来的特征工程要做什么,都要优先消除方差为0或者方差极低的特征。
- 比如:朝阳区的房价预测,其中样本有一列特征为温度,则要知道朝阳区包含在样本中的房子对应的气象温度几乎一致或者大同小异,则温度特征则对房价的区分是无意义的。
- API:from sklearn.feature_selection import VarianceThreshold
- VarianceThreshold(threshold=x)threshold方差的值,删除所有方差低于x的特征,默认值为0表示保留所有方差为非0的特征
- fit_transform(X)#:X为特征
from sklearn.feature_selection import VarianceThreshold
v = VarianceThreshold(threshold=0.2)
result = v.fit_transform(feature)
一般的手法是过滤一半,所以会选择所有特征的方差中位数作为方差阈值过滤的条件
import numpy as np
median_value = np.median(feature.var(axis=0).values)
v = VarianceThreshold(threshold=median_value)
result = v.fit_transform(feature)
一般衡量的方法也就看其最后模型训练的精度以及耗时
PCA降维
在误差较小的情况下,用低维度表示高纬度的事物
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit_transform([[0,2,4,3],[0,3,7,3],[0,9,6,3]])
数据集
数据集划分
一般划分数据集分为训练集和测试集,也有验证集的部分,这里主要阐述训练集和验证集
-
训练集:训练模型 -
测试集:评估模型 -
数据集划分的API
- from sklearn.model_selection import train_test_split
- train_test_split(x,y,test_size,random_state)参数介绍:
- x:特征
- y:目标
- test_size:测试集的比例
- random_state:打乱的随机种子
- 返回值:训练特征,测试特征,训练目标,测试目标
数据集接口介绍
sklearn自带相关数据集
- sklearn.datasets.load_*():获取小规模的数据集
- sklearn.datasets.fetch_*(data_home=None,subset):获取大规模的数据集data_home表示数据集下载目录,None为默认值表示的是家目录/scikit_learn_data(自动创建该文件夹)下。需要从网络下载.subset为需要下载的数据集,可以为train,test,all
import sklearn.datasets as datasets
data = datasets.load_wine()
feature = data['data']
target = data['target']
datasets.fetch_20newsgroups(data_home='./datasets',subset='test')
切分数据集
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
feature = iris['data']
target = iris['target']
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2020)
|