机器学习算法基础

目录

可用数据集

特征工程

数据的特征抽取

对字典数据进行特征值化

文本特征抽取

TfidfVectorizer

数据的特征预处理

归一化

标准化

缺失值

数据降维

PCA

线性判别分析LDA

机器学习基础

数据类型

机器学习算法分类

监督学习(预测)

无监督学习

机器学习开发流程

sklearn数据集和估计器

数据集

sklearn分类数据集

数据集进行分割

用于分类的大数据集(新闻)

sklearn回归数据集

监督学习

分类算法——k近邻算法(KNN)和朴素贝叶斯算法

分类模型的评估

模型的选择与调优

分类算法——决策树和随机森林

回归算法

分类算法——逻辑回归

非监督学习


可用数据集

scikit-learn

kaggle

UCI

数据集的结构包括 特征值+目标值

机器学习中,数据中有重复值不需要去重

特征工程

原始数据转换为更好地代表预测模型的潜在问题的特征的过程,提高预测准确性

数据的特征抽取

对文本等数据进行特征值化

sklearn是python一个库

import sklearn

sklearn.feature_extraction  特征抽取API

对字典数据进行特征值化

sklearn.feature_extraction.DictVectorizer

DictVectorizer(spqrse=True,...)

DictVectorizer.fit_transform(X)

X:字典或者包含字典的迭代器

返回值:返回sparse矩阵

DictVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前的数据格式

DictVectorizer.get_feature_names()

返回类别名称

DictVectorizer.transform(X)

按照原先的标准转换

可以使用 from sklearn.feature_extraction import DictVectorizer 导入

把字典中一些类别的数据,分别进行转换成特征;一些数值类型的数据,直接转换为数据

数组形式,有类别的这些特征,先要转换为字典数据

DictVectorizer(spqrse=False) 得到的是one-hot编码,把字典中类别的数据转换为one-hot编码,利于分析

文本特征抽取

对文本数据进行特征值化

sklearn.feature_extraction.text.CountVectorizer

CountVectorizer()

返回词频矩阵

CountVectorizer.fit_transform(X)

X:文本或者包含文本字符串的可迭代对象

返回值:返回sparse矩阵

CountVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前的数据格式

CountVectorizer.get_feature_names()

返回单词列表

可以使用 from sklearn.feature_extraction.text import CountVectorizer 导入

CountVectorizer()里面没有sparse,所以可以使用.toarray()实现该效果

统计文中所有词,重复的只看作一次,生成词的列表,然后对每篇文章,在词的列表里面统计每个词出现次数。单个字母不统计

文本特征抽取:Count 

因为分词默认是以逗号或者空格分词,所以对于一句中文,只能识别为一个词,使用jieba分词解决该问题

import jieba

jieba.cut("中文句子")

返回值:词语生成器

con1=jieba.cut("中文")   #分词

content1=list(con1)    #转换为列表

c1=' '.join(content1)   #把列表转换为字符串并以空格分开

单个汉字不会被统计

TfidfVectorizer

TfidfVectorizer(stop_words=None,...)

返回词的权重矩阵

TfidfVectorizer.fit_transform(X)

X:文本或者包含文本字符串的可迭代对象

返回值:返回sparse矩阵

TfidfVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回值:转换之前的数据格式

TfidfVectorizer.get_feature_names()

返回单词列表

可以使用 from sklearn.feature_extraction.text import TfidfVectorizer 导入

tf:term frequency  idf:逆文档频率 inverse document frequency

tf 词出现的次数

log(总文档数量/该词出现的文档数量)

tf*idf 该值越高,词的重要性越大

tf idf相比于上两种方式要好

数据的特征预处理

通过特定的统计方法,将数据转换成算法要求的数据

数值型数据:标准缩放:

1.归一化 2.标准化 3.缺失值

类别型数据:one-hot编码

时间类型:时间的切分

sklearn特征处理API sklearn.preprocessing

归一化

几个特征同等重要的时候,进行归一化,使得各个特征不会对最终结果造成更大的影响

通过对原始数据变换把数据映射到0-1之间

公式: {X}'= \frac{x-min}{max-min}      {X}''= {X}'*\left ( mx-mi \right )+mi

作用于每一列,max为一列的最大值,min为一列的最小值,那么{X}''为最终结果,mx mi分别为指定区间值,默认mx为1,mi为0

sklearn归一化API:sklearn.preprocessing.MinMaxScaler

MinMaxScaler(feature_range=(0,1)...)   每个特征缩放到给定范围(默认0-1)

MinMaxScaler.fit_trasform(X)

x:numpy array格式的数据 [n_samples,n_features]

返回值:转换后的形状相同的array

归一化缺点:如果有异常点,容易影响最大值最小值,鲁棒性不好,不稳定,只适合传统精确小数据场景

标准化

对原数据进行转换,把数据变到均值为0,方差为1的范围内

公式:{X}'=\frac{x-mean}{\sigma }   

作用于每一列,mean平均值,\sigma标准差

sklearn标准化API:sklearn.preprocessing.StandardScaler

StandardScaler(...)

处理之后每列所有数据都聚集在均值0附近,标准差为1

StandardScaler.fit_transform(X)

x:numpy array格式的数据[n_samples,n_features]

返回值:转换后形状相同的array

StandardScaler.mean_

原始数据中每列特征的平均值

StandardScaler.std_

原始数据中每列特征的方差

少量异常点对平均值和方差影响小,在样本足够多的情况下比较稳定,适合现代嘈杂大数据场景

缺失值

删除或者插补

插补更常用:常按特征值列的平均值、中位数填补

Imputer(missing_values='NaN',strategy='mean',axis=0)  axis=0是按列,1按行

完成缺失值插补

Imputer.fit_transform(X)

x:numpy array格式的数据[n_samples,n_features]

返回值:转换后形状相同的array

注意:这里只能识别np.nan这样的数据缺失值,例如:可以使用pandas里面的replace("?",np.nan)将内容为问号的值替换为可识别的缺失值np.nan

numpy的数组中可以使用np.nan或np.NaN代替缺失值,属于float类型

如果是文件中的一些缺失值,可以替换成nan,通过np.array转换成float型的数组即可

数据降维

维度:特征的数量

特征选择:原因:1.冗余:消耗计算性能  2.噪声:影响预测结果

                 方式:过滤式、嵌入式、包裹式

过滤式:从方差大小来考虑所有样本这个特征的数据情况

sklearn.feature_selection.VarianceThreshold

VarianceThreshold(threshold=0)   这个取值没有最优,一般在0-10之间

删除所有低方差特征(因为低方差数据基本一样)

VarianceThreshold.fit_transform(X)

X:numpy array格式的数据[n_samples,n_features]

返回值:训练差异低于threshold的将被删除,默认为0,保留所有非0方差的特征

PCA

是一种分析和简化数据集的技术

使数据维数压缩,尽可能降低原数据维数(复杂度),损失少量信息

PCA(n_components=None) n_components如果是小数,0-1之间,表示保留原数据的程度  如果是整数,表示减少后的特征数量,一般用小数(90%-95%)

PCA.fit_transform(X)

X:numpy array格式的数据[n_samples,n_features]

返回值:转换后指定维度的array

线性判别分析LDA

机器学习基础

算法是核心,数据和计算是基础

数据类型

离散型数据

连续型数据

离散型区间内不可分,连续型可分

机器学习算法分类

监督学习(预测)

有特征值和目标值

分类:目标值是离散型

回归:目标值是连续型

标注

无监督学习

只有特征值

机器学习开发流程

数据:1.公司本身就有数据

           2.合作过来的数据

           3.购买的数据

1.原始数据:明确问题做什么,建立模型  根据目标值数据类型划分应用种类

2.数据的基本处理:用pd处理数据(缺失值,合并表...)

3.特征工程(特征进行处理) (重要)

   模型:算法+数据

4.找到合适算法进行预测

5.模型的评估,判定效果

合格:上线使用,以API形式提供

不合格:1.换算法、参数  2.特征工程

sklearn数据集和估计器

数据集

数据分为训练集和测试集

样本按70% 30%或80% 20%或75% 25%划分,常用75% 25%

训练数据用于训练,构建模型

测试数据用于检验,评估模型是否有效

API:sklearn.model_selection.train_test_split

sklearn.datasets 加载获取流行数据集

    datasets.load_*()   获取小规模数据集,数据包含在datasets里

datasets.fetch_*(data_home=None)  获取大规模数据集,需要从网络上下载,函数的第一个参数data_home表示数据集下载的目录,默认是~/scikit_learn_data/

load*和fetch*返回的数据类型datasets.base.Bunch(字典格式)

  包括:    data:特征数据数组,[n_samples * n_features]二维numpy.ndarray数组

                 target:标签数组,是n_samples一维numpy.ndarray数组

                 DESCR:数据描述

                 feature_names:特征名,新闻数据、手写数字、回归数据集没有这个

                 target_names:标签名

sklearn分类数据集

sklearn.datasets.load_iris()   加载并返回鸢尾花数据集

sklearn.datasets.load_digits() 加载并返回数字数据集

数据集进行分割

sklearn.model_selection.train_test_split(*arrays,**options)

x  数据集的特征值

y 数据集的标签值

test_size 测试集的大小,一般为float

random_state 随机数种子,不同的种子会造成不同的随机采样结果,相同种子采样结果相同

return 训练集特征值,测试集特征值,训练标签,测试标签(默认随机取)

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

li = load_iris()

# print("获取特征值")
# print(li.data)
# print("目标值")
# print(li.target)
# print(li.DESCR)

# 注意返回值, 训练集 train  x_train, y_train        测试集  test   x_test, y_test
x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)

print("训练集特征值和目标值:", x_train, y_train)
print("测试集特征值和目标值:", x_test, y_test)

用于分类的大数据集(新闻)

sklearn.datasets.fetch_20newsgroups(data_home=None,subset='train')

           data_home:下载目录

           subset:'train'或者'test','all'可选,选择要加载的数据集,训练集的“训练”,测试集的“测试”,两者的“全部”

from sklearn.datasets import load_iris, fetch_20newsgroups
from sklearn.model_selection import train_test_split

news = fetch_20newsgroups(subset='all')

print(news.data)
print(news.target)    #获取里面的特征值和目标值

   datasets.clear_data_home(data_home=None)   清除目录下的数据

sklearn回归数据集

sklearn.datasets.load_boston()   加载并返回波士顿房价数据集

sklearn.datasets.load_diabetes() 加载和返回糖尿病数据集

监督学习

估计器:分类估计器  回归估计器

1.调用数据 fit(x_train,y_train)

2.输入测试集的数据

     1:y_predict=predict(x_test)

     2:预测的准确率:score(x_test,y_test)

分类算法——k近邻算法(KNN)和朴素贝叶斯算法

k近邻算法(KNN)

定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)样本中,大多数属于一个类别,那该样本也属于这个类别

距离公式:欧式距离

两个样本a(a1,a2,a3), b(b1,b2,b3)

\sqrt{(a1-b1)^{^{2}})+(a2-b2)^{2})+(a3-b3)^{2})}

K-近邻算法之前要进行标准化 fit_transform()

API:sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

n_neighbors:int,默认等于5,查询默认使用的邻居数

实例中数据处理用到的函数:

1.缩小数据集范围

DataFrame.query()

2.处理日期数据

pd.to_datetime

pd.DatetimeIndex

3.把时间戳变为分割开的日期数据

4.删除没用的日期数据

DataFrame.drop()  axis=1是列

5.将签到位置少于n的用户删除

place_count=data.groupby('place_id').count()

tf=place_count[place_count.row_id>n].reset_index()

data=data[data['place_id'].isin(tf.place_id)] 

实例流程:

1.数据集处理

2.分割数据集

3.数据集标准化

4.估计器进行分类预测

k—近邻算法 

k值取很小,容易受异常点影响

k值取很大,容易受k值数量(类别)波动影响 最好k个近邻都是同一个样本

算法缺点:性能问题,时间复杂度高  k需要提前设定,设定不好精度不高

优点:简单,无需参数估计(n_neighbors不是算法内部参数,是超参数),无需训练

使用场景:小数据场景,几千到几万样本,具体场景具体业务中测试

朴素贝叶斯算法

贝叶斯公式、拉普拉斯平滑

API:sklearn.naive_bayes.MultinomialNB(alpha=1.0)   alpha:拉普拉斯平滑系数

缺点:训练集误差大的话,结果不好,是做了样本中属性独立的假设,如果事实是不独立,结果不准确

优点:分类准确,速度快,算法简单,对缺失数据不敏感,不需要调参

分类模型的评估

准确率

estimator.score()

精确率(一般不考虑)

预测结果为正例的样本中,真实为正例的比例

召回率(查的全,对正样本的区分能力)

真实为正例的样本中,预测结果为正例的比例

API:sklearn.metrics.classification_report(y_true,y_pred,target_names=None)

y_true 真实目标值

y_pred 估计器预测目标值

target_names 目标类别名称

return 每个类别精确率和召回率

模型的选择与调优

交叉验证和网格搜索对K—近邻算法调优

交叉验证:所有数据分成n等分,为了让模型更加准确可信

超参数搜索/网格搜索:调参数

每组超参数都用交叉验证进行评估,多个超参数两两组合,最后选出最优参数组合(一般使用十折交叉验证)

API:sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)

estimator:估计器对象(比如说knn)

param_grid: 估计器参数(超参数)之前先构造超参数的一些值,字典格式,param={“n_neighbors”:[3,5,10]} param_grid=param

cv: 指定几折交叉验证

此外还需要:

fit: 输入训练数据  fit(x_train,y_train)

score:准确率   score(x_test,y_test)

结果分析:

best_score_:在交叉验证中验证的最好结果

best_estimator_: 最好的参数模型

cv_results_: 每次交叉验证后测试集准确率结果和训练集准确率结果

分类算法——决策树和随机森林

决策树

信息论基础

决策树的分类依据之一  信息增益:当得知一个特征条件后,减少的信息熵大小  

常见决策树使用的算法:ID3 信息增益 最大的准则

                                        C4.5 信息增益比 最大的准则

                                       CART 回归树:平方误差最小   

                                                  分类树: 基尼系数 最小的准则

API:sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)

         criterion:默认是'gini‘系数,也可以选择信息增益的熵’entropy‘

         max_depth:树的深度大小

         random_state:随机数种子

决策树优点:简单的理解和解释,树木可视化

                      需要很少的数据准备

           缺点:会创建不能很好的推广数据的过于复杂的树,过拟合

           改进:减枝cart算法(决策树API中已经实现)

                       随机森林

集成学习方法:随机森林

生成多个分类器/模型,随机森林是包含多个决策树的分类器,输出的类别是由个别树输出的类别的众数决定

随机森林建立多个决策树的过程:

单个树的建立过程:1.随机在N个样本当中选择一个样本,重复N次 随机有返回的抽样(bootstrap抽样),样本有可能重复

                                 2.随机在M个特征中选出m个特征

例如建立10棵决策树,其中样本和特征大多不一样

API:sklearn.ensemble.RandomForestClassifier(n_estimators=10,criterion='gini',max_depth=None,bootstrap=True,random_state=None)

n_estimators:integer 是超参数,可选(default=10)  一般森林里的树木数量120,200,300,500,800,1200

criteria:string 可选(default="gini")分割特征的测量方法

max_depth:integer或None 是超参数,可选(默认=无),树的最大深度5,8,12,25,30

max_features="auto" 是超参数,每个决策树的最大特征数量  其中“auto”,最大数量=总特征数开根号 “sqrt”与auto一样 “log2”是总特征数以2为底求对数 

bootstrap:boolean 可选(default=True)是否在构建树时使用放回抽样

结果分析:

score 准确率

best_params_ 查看选择的最优参数模型

随机森林优点:

有极好的准确率,能在大数据上运行,能处理高维特征的输入样本,不需要降维,能评估各个特征在分类问题中的重要性

回归算法

线性回归:寻找一种能预测的趋势

线性关系:二维:直线关系  三维:特征,目标值,在平面当中

线性关系定义:

                        y=wx+b  b:偏置 w:权重 

通用公式:h(w)=w_{0}+w_{1}x_{1}+...=w^{T}x

其中,w,x为矩阵,w=\binom{w_{0}}{w_{1}},x=\binom{1}{x_{1}} 通过属性和权重的组合来预测结果

相当于 x:特征值  w:权重   h:目标值

损失函数(误差大小)

总损失定义:每个训练样本特征值预测得到的目标值与样本真实值差的平方和(误差的平方和),又称最小二乘法

优化过程是,寻找最小的损失

最小二乘法之正规方程

sklearn.linear_model.LinearRegression()     

返回值: coef_:回归系数

最小二乘法之梯度下降 其中包括超参数α学习速率

sklearn.linear_model.SGDRegressor()

返回值: coef_:回归系数 就是最小损失

线性回归同k—近邻一样,也需要标准化处理,特征值和目标值都要进行标准化处理,而且要实例化两个标准化API

回归性能评估

(均方误差MSE)评价机制:

MSE=\frac{1}{m}\sum_{i=1}^{m}(y^{i}-\overline{y})^{2}

y^{i}为预测值,\overline{y}为真实值

均方误差回归损失API:

mean_squared_error(y_true,y_pred)

y_true:真实值

y_pred:预测值

return:浮点数结果  

注意:真实值和预测值都是标准化之前的值

过拟合和欠拟合

过拟合:在训练数据上获得比其他假设更好的拟合,在训练数据以外数据集上却不能很好的拟合数据(模型过于复杂)

欠拟合:在训练数据上不能获得更好的拟合,在训练数据外的数据集上也不能很好的拟合数据(模型过于简单)

要根据结果现象(通过交叉验证)来判断是过拟合还是欠拟合:

训练集结果:表现不行+测试集结果:表现不行==》欠拟合

训练集结果理想(比如99%,均方误差2.0),测试集89%,均方误差10.0,与训练集结果相差太大,==》过拟合

欠拟合原因:学习到数据的特征太少       解决方法:增加数据的特征数量

过拟合原因:原始特征过多,存在嘈杂特征,使模型复杂     解决方法:正则化

正则化和岭回归

L2正则化:使权重缩小到接近0

线性回归容易出现过拟合,为了把训练集数据表现更好,使用L2正则化

Ridge岭回归 带有正则化的线性回归,解决过拟合

API:sklearn.linear_model.Ridge(alpha=1.0)

alpha:(超参数,0-1,1-10都可)正则化力度,对权重的影响 正则化力度增大,权重会越来越小,模型越来越简单

coef_:回归系数

岭回归比线性回归更可靠,更符合实际,对于病态数据较多的样本更有效

模型的保存与加载

from sklearn.externals import joblib

API: 保存 joblib.dump(模型的名称,(文件路径)'./temp/test.pkl')

         加载 estimator=joblib.load((文件路径)'./temp/test.pkl')

分类算法——逻辑回归

线性回归的式子作为逻辑回归的输入,解决二分类问题

线性回归的输入===》通过sigmoid函数===》转化为[0,1]区间的概率值 默认0.5作为阈值,小于0.5概率归为0,大于0.5概率归为1

API:sklearn.linear_model.LogisticRegression(penalty='l2',C=1.0)

penalty:超参数,正则化

C:超参数

coef_:回归系数

优点:适合需要得到一个二分类概率的场景,简单速度快

缺点:不适用于多分类

逻辑回归和朴素贝叶斯比较

解决问题   二分类      多分类

应用场景  二分类需要概率    文本分类

参数   正则化力度        无

           判别模型(K——近邻,决策树,随机森林,神经网络都是判别模型)          生成模型(需要从历史数据总结出先验概率)

非监督学习

k-means

K:把数据划分成多少个类别

API: sklearn.cluster.KMeans(n_clusters=8,init='k-means++')

n_clusters:超参数,开始聚类的中心数量  (如果知道要分为几类就把n_clusters设为几,不知道的话n_clusters就是超参数)

init:初始化方法

labels_:默认标记的类型,可以和真实值比较

聚类评估标准:

轮廓系数:[-1,1] 结果最好:1  结果最差:-1

sklearn.metrics.silhouette_score(X,labels)

X:特征值

labels:被聚类标记的目标值

 

 


版权声明:本文为weixin_46976767原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。