简介
1. 机器学习是从[数据]中自动分析获得[规律(模型)],并利用规律对未知数据进行[预测]。
2. 算法模型:
就是一个特殊的对象。该对象内部已经集成或者封装好了某种形式的方程,只不过这个方程是一个还没有求出解的方程。
3. 算法模型的作用:
对未知事物进行预测
预测:利用模型对一件事情计算出一个未知的结果。
对未知事物进行分类
分类:将一个未知归类的事物给归属到已知的类群中。
4. 样本数据
特征数据:自变量。【面积,楼层,采光率】
标签/目标数据:因变量.【售价】
作用:样本数据是用来训练模型。
训练模型:将样本数据带入到算法模型中,对模型中还没有求出解的方程进行求解操作。
注意:方程的解其实就是模型预测或者分类的结果。
5. 模型的分类:
有监督学习算法:
如果模型需要的样本数据必须包含特征数据和标签数据,则该模型数据有监督学习算法分类的产物。
无监督学习算法:
模型只需要样本数据中包含特征数据即可,标签数据有无都行。
6. 样本数据(数据集)的载体:
通常情况下历史数据都不会存储在数据库中,而是存储在文件中(csv文件)
数据库存储数据存在的问题:
①性能瓶颈:数据量级大的数据很难存储和进行高效的读写。
②数据存储格式不符合机器学习要求的数据格式。
7. 样本数据的获取途径:
① kaggle:数据竞赛平台。
②UCI数据集:是一个常用的机器学习标准测试数据集,是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库
③sklearn
特征工程
包括:
①特征抽取
②数据特征的预处理
③特征选择
- 为什么需要特征工程
样本数据中的特征有可能存在缺失值、重复值、异常值等等,那么我们是需要对特征中的相关的噪点数据进行处理的,那么处理的目的就是为了营造出一个更纯净的样本集(数据集越纯净则越便于让模型总结出数据集中潜在的规律),让模型基于这组数据可以有更好的预测能力。当然特征工程不是单单只是处理上述操作。 - 什么是特征工程
特征工程是将原始数据转换为更好的能代表模型能够处理数据的潜在问题对应特征的过程,从而提高对未知数据预测的准确性。所以特征工程就是对特征的相关处理。 - 特征工程的意义
直接影响模型预测的结果。 - 如何实现特征工程
导入sklearn包 - sklearn介绍
是python语言中的机器学习工具,包含了很多知名的机器学习算法的实现,其文档完善,容易上手。
功能:
分类模型
回归模型
聚类模型
特征工程
特征抽取
- 目的:
特征值化:将非数值型的特征转换成数值形式的特征。
例子:
from sklearn.feature_extraction.text import CountVectorizer
vector = CountVectorizer()
res = vector.fit_transform(
[
'lift is short,i love python',
'lift is too long,i hate python'
]
)
print(res.toarray())
输出:
[[0 1 1 0 1 1 1 0]
[1 1 1 1 0 1 0 1]]
字典特征抽取
作用:对字典数据进行特征值化
from sklearn.feature_extraction import DictVectorizer
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d = DictVectorizer() #1.实例化工具对象,常用sparse=True/False参数指定下面函数的返回值为sparse矩阵或数组
#该方法的返回值就是特征值化之后的结果
result = d.fit_transform(alist) #2.调用指定方法对原始数据进行特征值化
print(result)
(0, 0) 1.0
(0, 3) 33.0
(1, 1) 1.0
(1, 3) 42.0
(2, 2) 1.0
(2, 3) 40.0
alist = [
{'city':'BeiJing','temp':33},
{'city':'GZ','temp':42},
{'city':'SH','temp':40}
]
d = DictVectorizer(sparse=False)
result = d.fit_transform(alist)
print(d.get_feature_names())
print(result)
['city=BeiJing', 'city=GZ', 'city=SH', 'temp']
[[ 1. 0. 0. 33.]
[ 0. 1. 0. 42.]
[ 0. 0. 1. 40.]]
什么是sparse矩阵
sparse矩阵就是一个变相的数组或者列表,目的是为了节省内存。
用pandas也可实现对字典的特征值化。
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']
one_code_result = pd.get_dummies(df['color'])
one_code_result
文本特征抽取
作用:
对文本数据进行特征值化
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())##将sparse矩阵转换为数组
['hate', 'is', 'isis', 'left', 'long', 'love', 'python', 'short', 'too']
[[0 0 1 1 0 1 1 1 0]
[1 1 0 1 1 0 1 0 1]]
特征的预处理:对数值型的数据进行处理
无量纲化:
在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求这种需求统称为将数据“无量纲化”。
譬如梯度和矩阵为核心的算法中,譬如逻辑回归,支持向量机,神经 网络,无量纲化可以加快求解速度;
而在距离类模型,譬如K近邻,K-Means聚类中,无量纲化可以帮我们提升模型精度,避免某一个取值范围特别大的特征对距离计算造成影响。
一个特例是决策树和树的集成算法,对决策树我们不需要无量纲化,决策树可以把任意数据都处理得很好。
预处理就是用来实现无量纲化的方式。
概念:通过特定的统计方法(数学方法),将数据转换成算法要求的数据
方式:
①归一化
②标准化
归一化
import numpy as np
data = pd.DataFrame(data=np.random.randint(10,500,size=(5,3)))
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
result = mm.fit_transform(data)
result
array([[0. , 1. , 0.08860759],
[0.07792208, 0.36507937, 1. ],
[0.22857143, 0.69206349, 0.39240506],
[0.04155844, 0. , 0.27848101],
[1. , 0.92063492, 0. ]])
标准化
from sklearn.preprocessing import StandardScaler
s = StandardScaler()
result = s.fit_transform(data)
result
array([[ 0.60183668, -0.42772629, 0.80643289],
[-1.13395705, 0.40361115, -0.13566161],
[ 1.11403811, -1.19560285, -1.89172574],
[-1.27623522, -0.50387933, 0.67077128],
[ 0.69431749, 1.72359731, 0.55018318]])
归一化和标准化总结
对于归一化来说,如果出现了异常值则会响应特征的最大最小值,那么最终结果会受到比较大影响。
对于标准化来说,如果出现异常点,由于具有一定的数据量,少量的异常点对于平均值的影响并不大,从而标准差改变比较少。
StandardScaler和MinMaxScaler选哪个?
看情况。大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。 MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。
建议先试试看StandardScaler,效果不好换MinMaxScaler。
特征选择
在做特征选择之前,有三件非常重要的事:跟数据提供者联系,跟数据提供者沟通,跟数据提供者开会。
一定要抓住跟你提供数据的人,尤其是理解业务和数据含义的人,聊一段时间。技术能够让模型起飞,前提是你和业务人员一样理解数据。所以特征选择的第一步,其实是根据我们的目标,用业务常识来选择特征。
特征选择的原因:
冗余:部分特征的相关度高,容易消耗计算机的性能。
噪点:部分特征对预测结果有偏执影响。
特征选择的实现:
①人为对不相关的特征进行主观舍弃。
②如果遇见极端情况,我们无法依赖对业务的理解来选择特征,则在已有特征和对应预测结果的基础上,使用相关的工具过滤掉一些无用或权重较低的特征
工具:
Filter(过滤式)[主要讲解]
Embedded(嵌入式):决策树模型会自己选择出对其重要的特征。
PCA降维
Filter过滤式(方差过滤)
原理:这是通过特征本身的方差来筛选特征的类。比如一个特征本身的方差很小,就表示样本在这个特征上基本没有差异,可能特征中的大多数值都一样,甚至整个特征的取值都相同,那这个特征对于样本区分没有什么作用。所以无论接下来的特征工程要做什么,都要优先消除方差为0或者方差极低的特征。
data = pd.DataFrame(data=np.random.randint(10,50,size=(6,5)))
from sklearn.feature_selection import VarianceThreshold
vt = VarianceThreshold(threshold=50) ##threshold为方差的值,删除所有方差低于x的特征,默认值为0表示保留所有方差为非0的特征。
result = vt.fit_transform(data)
result
array([[30, 18, 42],
[28, 44, 43],
[47, 37, 25],
[18, 17, 18],
[24, 20, 47],
[13, 37, 29]])
方差过滤对模型的影响:减少运行时间,提高准确率,
注意:
方差过滤主要服务的对象是:需要遍历特征的算法模型。
而过滤法的主要目的是:在维持算法表现的前提下,帮助算法们降低计算成本。
PCA降维
作用:可以削减回归分析或者聚类分析中特征的数量。
data = [[0,2,4,3],[0,3,7,3],[0,9,6,3]]
from sklearn.decomposition import PCA
pca = PCA(n_components=3)##n_components可以为小数(保留特征的百分比),整数(减少到的特征数量)
result = pca.fit_transform(data)
result
array([[-2.88362421e+00, -1.25443227e+00, 2.03388303e-16],
[-1.45140588e+00, 1.56492061e+00, 2.03388303e-16],
[ 4.33503009e+00, -3.10488337e-01, 2.03388303e-16]])
sklearn的数据集
①数据集划分
②数据集接口介绍
数据集划分
前提:机器学习就是从数据中自动分析获得规律,并利用规律对未知数据进行预测。换句话说,我们的模型一定是要经过样本数据对其进行训练,才可以对未知数据进行预测的。
如果模型对原先的数据进行预测,由于模型(数据的规律)本来就是从该数据中获取的,所以预测的精度几乎会是百分之百。所以想要评估模型的好坏,需要使用一组新数据对模型进行评估。
因此我们需要将原先的样本数据拆分成两部分:
训练集:训练模型
测试集:评估模型
不同类型的模型对应的评估方式是不一样的。
import sklearn.datasets as datasets
iris = datasets.load_iris()
#1.提取样本数据
feature = iris.data # 特征数据
target = iris.target # 标签数据
#2.对数据集做拆分
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(feature,target,test_size=0.2,random_state=2020)
# test_size为测试集规模,random_state为打乱原数据的随机种子
## x_train训练集特征数据
## y_train训练集标签数据
## x_test测试集特征数据
## y_test测试集标签数据
数据集接口介绍
①sklearn.datasets.load_*():
获取小规模的数据集
②sklearn.datasets.fetch_*(data_home=None,subset):
获取大规模的数据集data_home表示数据集下载目录,None为默认值表示的是家目录/scikit_learn_data(自动创建该文件夹)下。需要从网络下载.subset为需要下载的数据集,可以为train,test,all
机器学习基础
机器学习最终进行预测出来的结果其实都是通过相关的算法计算出来的结果。所以说在机器学习中算法是核心,数据是计算的基础。
机器学习算法分类
机器学习中的数据类型分为:
离散型数据:
①离散变量则是通过计数方式取得的,即是对所要统计的对象进行计数,增长量非固定的。
连续型数据:
②连续变量是一直叠加上去的,增长量可以划分为固定的单位
连续型数据的增长是有规律的,离散型数据的增长是没有规律的。
连续性数据是区间可分的,而离散型数据是区间不可分的。
分类和回归问题
分类算法基于的是【标签数据】为【离散型】数据
回归算法基于的是【标签数据】为【连续型】数据
结论:在社会中产生的数据必然是离散型或者是连续型的数据,那么企业针对数据所产生的需求也无非是分类问题或者回归问题。
机器学习开发流程
1.数据采集
公司内部产生的数据
和其他公司合作获取的数据
购买的数据
2.分析数据所对应要解决需求或者问题是什么?根据目标数据推断问题属于回归还是分类!
3.数据的基本处理
数据清洗
合并
级联等
4.特征工程:对特征进行处理
特征抽取
特征预处理
降维等
5.选择合适的模型,然后对其进行训练
6.模型的评估
7.上线使用