机器学习(入门2)

这篇博客详细介绍了机器学习中的分类算法,包括决策树、KNN、朴素贝叶斯和随机森林。讲解了各个算法的基本原理、API使用、特点及优缺点,并提供了代码示例。还提到了模型选择与调优中的交叉验证和网格搜索,以及超参数的重要性。
摘要由CSDN通过智能技术生成

机器学习(入门2)

3 分类算法
3.1 sklearn转换器和预估器(预备知识)
3.1.1 转换器
1)实例化
2)调用fit_transform fit():计算每一列的均值方差 transform:std进行最终转换
3.1.2 预估器estimator(sklearn 机器学习算法实现)
流程:1 实例化estimator
2 estimator.fit(x_train,y_train) 计算 -----调用完毕,模型即生成
3 模型评估:
1)直接比对真实值和预测值 y_predict = estimator.predict(x_test)
y_test==y_predict
2)计算准确率 accuracy = estimator.score(x_test,y_test)
3.2 KNN算法:[由邻居判断类别]
3.2.1定义:样本特征空间中k个量相似(即特征空间中最邻近)的样本中大多数属于某一个类别,则此样本属于此类别。
确定邻居:计算距离(常用欧氏距离,曼哈顿距离,明可夫斯基距离)
【注:k值过大,受样本不均衡影响;k值过小,容易受异常点影响】
3.2.2 KNN算法API:sklearn.neghbors.KNeighborsClassifier(n_neighbors=5,algorithm=’auto’)
n_neighbors: k值
Algorithm:{tree,auto,kd_tree…}
3.2.3 KNN特点:简单易于实现,无需训练,必须指定K值,K值选取很关键,内存开销大,小样本数据:几千~几万样本

代码示例:

 KNN算法对鸢尾花分类
 1 获取数据
 2 数据集划分 训练和测试集
 3 特征工程,标准化
 4 KNN预估器流程
 5 模型评估
'''
from sklearn.datasets import load_iris,fetch_20newsgroups
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.tree import DecisionTreeClassifier,export_graphviz
def KNN_demo():
   iris = load_iris()
   x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
   transfor=StandardScaler()
   # 训练集标准化
   x_train = transfor.fit_transform(x_train)
   # 测试集做和训练集一样操作,仅transform
   x_test = transfor.transform(x_test)
   # KNN预估器流程
   # 实例化
   estimator = KNeighborsClassifier(n_neighbors=3)
   estimator.fit(x_train,y_train)
   y_predict = estimator.predict(x_test)
   print("比对真实值:\n",y_predict==y_test)
   score = estimator.score(x_test,y_test)
   print("准确率:\n",score)
   return None

3.3 模型选择与调优
3.3.1 交叉验证(CA):将训练数据分为训练和验证集
3.3.2 超参数搜索-网格搜索(GS)
作用:一般,很多参数需要手动指定(如:KNN算法的K值),这种称谓超参数,所以对模型预设几种超参数组合,每组都采用交叉验证,最后得到最优参数组合建立模型
API:sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=NONE)
Estimator:预估器对象
param_grid:估计其参数,字典形式 {“n_neighbors”:[1,3,5]}
Cv:指定几折交叉验证
Fit():输入训练数据
Score():准确率
结果:最佳参数:best_params_ ; 最佳结果:best_score_ ;
最佳估计器:best_estimator_ ; 交叉验证结果:cv_results_
代码示例:

def KNN_iris_GSCV():
# KNN算法加上网格搜索和交叉验证
   iris = load_iris()
   x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=6)
   transfor=StandardScaler()
   # 训练集标准化
   x_train = transfor.fit_transform(x_train)
   # 测试集做和训练集一样操作,仅transform
   x_test = transfor.transform(x_test)
   # KNN预估器流程
   # 实例化
   estimator = KNeighborsClassifier()
  # 网格搜索和交叉验证
   params_GS = {"n_neighbors":[1,3,5,7,9,11]}
   estimator = GridSearchCV(estimator,params_GS,cv=10)
   estimator.fit(x_train,y_train)
   y_predict = estimator.predict(x_test)
   print("比对真实值:\n",y_predict==y_test)
   score = estimator.score(x_test,y_test)
   print("准确率:\n",score)
   print("最佳参数:\n",estimator.best_params_)
   print("最佳结果:\n",estimator.best_score_)
   print("最佳估计器:\n",estimator.best_estimator_)
   print("交叉验证结果:\n",estimator.cv_results_)
   return None

3.4 朴素贝叶斯算法(概率)朴素:默认特征与特征相互独立 + 贝叶斯公式
3.4.1 概率:联合概率 P(A,B);条件概率P(A|B) ; 相互独立P(A,B)=P(A)P(B)
公式:
应用:文本分类,情感分析,避免出现概率值为0,采用拉普拉斯平滑系数
拉普拉斯平滑系数: a为指定系数=1,m为训练中特征词个数
3.4.2 API:Sklearn.naive_bayes.MultinorialNB(alpha=1.0)
3.4.3 特点:对缺失数据不敏感,简单分类准确度高,速度快,特征属性相关时效果不好。
代码示例:

def nb_news():
    # 朴素贝叶斯分类
    # 获取数据
    news = fetch_20newsgroups(data_home="/classfy_alg",subset="all")

    # 划分数据及
    x_train,x_test,y_train,y_test = train_test_split(news.data,news.target)
    # 特征提取 文本特征提取
    transfor = TfidfVectorizer()
    x_train = transfor.fit_transform(x_train)
    x_test = transfor.transform(x_test)
    # NB算法预估器
    estimator = MultinomialNB()
    estimator.fit(x_train,y_train,)
    # 评估
    y_predict = estimator.predict(x_test)
    print("比对真实值:\n", y_predict == y_test)
    score = estimator.score(x_test, y_test)
    print("准确率:\n", score)
    return None

3.5 决策树:if—else :高效的决策顺序–特征先后顺序 ,划分:信息增益值越大越优先。
3.5.1 原理:信息熵,信息增益
信息熵
信息增益 g(D,A) = H(D) - 条件熵H(D|A)
3.5.2 API:
sklearn.tree.DecisionTreeClassfier(criyerion=’gini’,max_depth=None,random_state=None
criyerion默认’gini’,也可用信息增益:‘entropy’
max_depth:深度大小
random_state:随机数种子
3.5.3 决策树可视化
保存树的结构到dot文件
API:Sklearn.tree.export_graphviz() //能导出DOT格式
Tree.export_graphviz(estimator,out_file=’tree.dot’,feature_names=[“,”])
转化为树形:网站 :webgraphviz.com
特点:简单,可视化,数据庞大容易过拟合,改进:剪枝cart算法;随机森林。
代码示例:

def tree_desicion_demo():
    # 决策树对鸢尾花分类,不用做标准化
    iris = load_iris()
    x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target,random_state=22)
    estimator = DecisionTreeClassifier(criterion="entropy")
    estimator.fit(x_train,y_train)
    y_predict = estimator.predict(x_test)
    print("2 比对真实值:\n", y_predict == y_test)
    score = estimator.score(x_test, y_test)
    print("2 准确率:\n", score)
    # 可视化决策树
    export_graphviz(estimator,out_file="tree.dot",feature_names=iris.feature_names)
    return None

3.6 随机森林:包含多个决策树的分类器,由众数决定
3.6.1 原理:随机:特征值随机:从M个特征中随机抽取m个特征 ,M>>m(降维)
训练集随机:bootstrap 随机有放回抽样
森林:多个决策树
3.6.2 API:
sklearn.ensemble.RandomForestClassifter(n_estimator=10,criterion=’gini’,max_depth=None,bootstrap=True,random_state=None,min_sample_split=2)
criterion=’gini’:划分方法
n_estimator=10:森林数目数量
Max_feature: 每个决策树的最大特征数量即m,属性:auto,sqirt,…
min_sample_split:结点划分最少样本数
min_sample_leaf:叶子结点最小样本数
超参数:n_estimator,max_depth, min_simples_split, min_sample_leaf
特点:在所有算法中,有较好的准确率,有效运行在大数据集,处理高维数据不必降维。

'''
 决策树泰坦尼克号预测幸存
 # 1 获取数据
   2 数据处理
       缺失值处理
       特征值-->字典类型
    3 准备好特征值目标值
    4 划分数据集
    5 特征工程 字典特征提取
    6 决策树预估器流程
'''
import pandas as pd
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier


def tree_tantan():
    path = "https://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt"
    titanic = pd.read_csv(path)
    # 筛选特征值和目标值
    x = titanic[["pclass","age","sex"]]
    y  = titanic["survived"]
    # 缺失值处理 填补平均值mean
    x["age"].fillna(x["age"].mean(),inplace=True)
    # 特征值 -->字典类型
    x = x.to_dict(orient="record")
    x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=22)
    #tezhengchouqu
    transfor = DictVectorizer()
    x_train=transfor.fit_transform(x_train)
    x_test = transfor.transform(x_test)
    estimator = DecisionTreeClassifier(criterion="entropy",max_depth=8)
    estimator.fit(x_train, y_train)
    y_predict = estimator.predict(x_test)
    print("2 比对真实值:\n", y_predict == y_test)
    score = estimator.score(x_test, y_test)
    print("2 准确率:\n", score)
    export_graphviz(estimator, out_file="titanic_tree.dot", feature_names=transfor.get_feature_names())
    # 随机森林对泰坦尼克预测
    estimator = RandomForestClassifier()
    params_GS = {"n_estimateor": [120, 200, 300, 500, 800, 1200],"max_depth":[5,8,10,15]}
    estimator = GridSearchCV(estimator, params_GS, cv=2)
    estimator.fit(x_train, y_train)
    y_predict = estimator.predict(x_test)
    print("比对真实值:\n", y_predict == y_test)
    score = estimator.score(x_test, y_test)
    print("准确率:\n", score)
    print("最佳参数:\n", estimator.best_params_)
    print("最佳结果:\n", estimator.best_score_)
    print("最佳估计器:\n", estimator.best_estimator_)
    print("交叉验证结果:\n", estimator.cv_results_)
    return None

本文是基于B站机器学习入门学习的笔记分享,有误之处,敬请指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值