一、k-近邻算法
1、工作机制:
- 给定一个测试样本
- 计算它到训练样本的距离
- 取离测试样本最近的
k
个训练样本 - “投票法”选出在这k个样本中出现最多的类别,就是预测的结果
2、计算距离公式(欧式距离)
3、api
4、优缺点
5、使用交叉验证和网格搜索对k近邻算法调优
1)交叉验证
1. 目的
交叉验证的目的是为了让模型评估更加准确可信。
2. 基本思想
基本思想是将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set or test set),首先用训练集对分类器进行训练,再利用验证集来测试训练得到的模型,以此来作为评价分类器的性能指标。
2)网格搜索
通常情况下,很多超参数需要调节,但是手动过程繁杂,所以需要对模型预设几种超参数组合,每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。
api:
代码:
knn = KNeighborsClassifier() #注意不用设置k值 param = {"n_neighbors": [3,5,10]} gscv = GridSearchCV(knn, param_grid=param, cv=10) gscv.fit(x_train, y_train) print(gscv.score(x_test, y_test)) print(gscv.best_score_) print(gscv.best_estimator_) print(gscv.best_params_) print(pd.DataFrame(gscv.cv_results_).T)
二、朴素贝叶斯算法
1、工作原理
朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入 xx ,利用贝叶斯定理求出后验概率最大的输出 yy 。
2、公式
3、api
4、案例
代码:
from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB def naviebayes(): #获取数据集 news = fetch_20newsgroups(subset='all') #进行数据分割 x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25) #对数据集进行特征抽取 tf = TfidfVectorizer() #对训练集中词的列表进行重要性统计 x_train = tf.fit_transform(x_train) x_test = tf.transform(x_test) #进行朴素贝叶斯算法的预测 mlt = MultinomialNB(alpha=1.0) mlt.fit(x_train,y_train) #打印预测结果 y_predict = mlt.predict(x_test) print("预测结果为:",y_predict) #打印准确率 ret = mlt.score(x_test,y_test) print("准确率为:",ret) return None if __name__ == "__main__": naviebayes()
结果:
预测结果为: [ 8 0 5 ... 11 13 16] 准确率为: 0.847623089983022
5、优缺点
三、决策树
1.原理
在现实生活中,我们会遇到各种选择,不论是选择男女朋友,还是挑选水果,都是基于以往的经验来做判断。如果把判断背后的逻辑整理成一个结构图,你会发现它实际上是一个树状图,这就是我们今天要讲的决策树。
2、几个概念
将哪个属性作为决策树根节点是个关键问题,在这里我们先介绍两个指标:纯度和信息熵。
纯度:你可以把决策树的构造过程理解成为寻找纯净划分的过程。数学上,我们可以用纯度来表示,纯度换一种方式来解释就是让目标变量的分歧最小。
信息熵:表示信息的不确定度
信息熵越大,纯度越低。当集合中的所有样本均匀混合时,信息熵最大,纯度最低。
我们在构造决策树的时候,会基于纯度来构建。而经典的 “不纯度”的指标有三种,分别是信息增益(ID3 算法)、信息增益率(C4.5 算法)以及基尼指数(Cart 算法)。
3、api
4、案例
代码:
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction import DictVectorizer from sklearn.tree import DecisionTreeClassifier def decisionTree(): #读取数据 titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt") #处理数据,找出特征值和目标值 x = titan[['pclass','age','sex']] y = titan['survived'] #处理缺失值 x['age'].mean()取平均值 inplace替换 x['age'].fillna(x['age'].mean(),inplace=True) #分割数据 x_train,x_test,y_train,y_test = train_test_split(x,y,train_size=0.25) #进行特征工程 x_train.to_dict(orient="records")将数据转换成字典形式 dict = DictVectorizer(sparse=False) x_train = dict.fit_transform(x_train.to_dict(orient="records")) x_test = dict.transform(x_test.to_dict(orient="records")) #利用决策树进行预测 dTree = DecisionTreeClassifier() dTree.fit(x_train,y_train) #预测准确率 print("预测的准确率:",dTree.score(x_test,y_test)) return None if __name__ == "__main__": decisionTree()
5、决策树结构图
6、优缺点
四、随机森林
1、简介
随机森林是一种多功能的机器学习算法,能够执行回归和分类的任务。同时,它也是一种数据降维手段,用于处理缺失值、异常值以及其他数据探索中的重要步骤,并取得了不错的成效。另外,它还担任了集成学习中的重要方法,在将几个低效模型整合为一个高效模型时大显身手。
在随机森林中,我们将生成很多的决策树,并不像在CART模型里一样只生成唯一的树。当在基于某些属性对一个新的对象进行分类判别时,随机森林中的每一棵树都会给出自己的分类选择,并由此进行“投票”,森林整体的输出结果将会是票数最多的分类选项;而在回归问题中,随机森林的输出将会是所有决策树输出的平均值。
2、api
4、代码案例
将预测泰坦尼克号案例算法换成随机森林
# -----------------利用随机森林进行预测---------------------- rf = RandomForestClassifier() param = {"n_estimators":[120,200,300],"max_depth":[5,8,15]} #使用交叉验证和网格搜索对超参数进行调优 gc = GridSearchCV(rf, param_grid=param,cv=2) gc.fit(x_train,y_train) #预测结果 print("准确率:",gc.score(x_test,y_test)) print("选择的模型:",gc.best_params_)
结果:
准确率: 0.8111675126903554 选择的模型: {'n_estimators': 300, 'max_depth': 5}