机器学习5——分类算法


机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。


访问作者github: https://github.com/NefelibataBIGR/Machine_Learning_Notes ,获取笔记代码

  • 深度学习 ⊆ 机器学习 ⊆ 人工智能
    • 机器学习是人工智能的一个实现途径
    • 深度学习是由机器学习发展而来
  • 应用领域:传统预测、图像识别、自然语言处理
  • 理论书:《机器学习》“西瓜书”、《统计学习方法》
  • 库:sklearn
  • ==模型选择==:
    image.png
    现在应用广泛的是集成学习算法(多个弱学习器组成强学习器):
  • Bagging(投票制,并行):随机森林
  • Boosting(残差拟合,串行):GBDT、XGBoosting、LightGBM、CatBoosting

五、分类算法

具体代码见Python>MachineLearning文件中的==classification.py==文件

  • 标签值:类别
  • 二分类问题见:逻辑回归与二分类(第六节)

1、kNN算法

  • k-近邻算法,k-nearest neighbor classification

  • 根据k个“邻居”推断自身类别

  • k个最相似(特征空间上最邻近)的样本大多属于一个类别,则推断所求样本类别也是这个类别

  • k值

    • 过小:容易受异常值影响
    • 过大:容易受样本不均衡影响
  • 计算距离

    • 欧几里得(欧式)距离:平方差求和开根
    • 曼哈顿距离:差绝对值求和
    • 闵可夫斯基距离:对欧式距离和曼哈顿距离公式的概括性的表述
  • ==必须先做标准化再kNN,避免量级的支配影响!!!==

  • 优点:简单易实现

  • 缺点

    • k值选择不当影响精度
    • 计算量大,内存消耗大
  • 应用场景:小数据场景(几千~几万样本)

API:

  • sklearn.neighbors.KNeighborsClassifier(n_neighbors= )
    • 参数(可省略):
      • n_neighbors= :k值,默认=5
      • algorithm= :可选{‘auto’ , ‘ball_tree’ , ‘kd_tree’ , ‘brute’},默认=’auto’,不同方法效率不同
      • 默认用欧氏距离
    • KNeighborsClassifier.fit(x_train , y_train):训练
    • KNeighborsClassifier.predict(x_test):预测
    • KNeighborsClassifier.score(x_test, y_test):评估

2、模型选择与调优

(1)交叉验证

  • n折交叉验证(cross-validation,CV):将训练集再分为训练集与验证集,分成n份(任意1份作为验证集,其他n-1份作为训练集),轮流进行验证,得到n个准确率,求平均作为总准确率
    image.png
    ↑四折交叉验证

  • 优点:让模型更加准确

(2)超参数搜索

  • 超参数:需要手动指定的参数(如k值)
  • 网格搜索(Grid search):预设几组超参数,每组采用交叉验证的方法评估,选出最优超参数
  • sklearn.model_selection.GridSearchCV(estimator , param_grid= , cv= )
    • 参数:

      • estimator:算法实例
      • param_grid=:estimator的超参数选择(字典形式)
        • 如:{ ‘n_neighbors’ : [1 , 3 , 5] }
      • cv=:指定几折交叉检验(常用10折)
    • GridSearchCV.fit(x_train , y_train):训练

    • GridSearchCV.predict(x_test):预测

    • GridSearchCV.score(x_test, y_test):评估

    • 属性:

      • 最佳超参数:.best_params_
      • 最佳结果:.best_score_
      • 最佳预估器:.best_estimator_
      • 交叉验证结果:.cv_results_

- 例:kNN预测鸢尾花类型

# 1、读取数据
iris = load_iris()
# print(iris)
   
# 2、划分数据集
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=1)
# print(type(x_train))

# 3、特征工程:标准化
trans = StandardScaler()
x_train = trans.fit_transform(x_train) # 对x_train进行标准化
x_test = trans.transform(x_test) # 对x_test也进行相同的标准化

# 4、训练knn模型
esti = KNeighborsClassifier() # 实例化一个预估器

para_grid = {'n_neighbors': [1, 3, 5, 7, 9, 11]}
esti = GridSearchCV(esti, param_grid=para_grid, cv=10) # 网格搜索+交叉验证

esti.fit(x_train, y_train) # 训练

# 5、评估模型
    # 方法1:
y_pred = esti.predict(x_test) # 预测
print("y_predict =", y_pred)
print("accuracy_1 =", np.sum(y_pred == y_test)/sum(np.ones(y_test.shape))) # 计算准确率

    # 方法2:
accuracy = esti.score(x_test, y_test) # 计算准确率
print("accuracy_2 =", accuracy)

# 最佳参数:best_params_
print("最佳参数:\n", esti.best_params_)
# 最佳结果:best_score_
print("最佳结果:\n", esti.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:\n", esti.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:\n", esti.cv_results_)

输出:
image.png

- 案例:Facebook签到位置预测

具体代码见Python>MachineLearning文件中的==facebook_knn.ipynb==文件

3、朴素贝叶斯算法

  • 分类结果是概率值,需要数据量大
  • 原理:朴素+贝叶斯
    • 贝叶斯:联合概率、条件概率、相互独立的概念定义,贝叶斯公式
    • 朴素:假设特征之间相互独立
    • 拉普拉斯平滑系数
      • 防止计算出的分类概率为0

image.png
α系数一般为1,m为训练文档中统计出的特征词数(所有有意义的特征词、不重复),N为所有C条件下所有词的个数,Ni为所有C条件下F1词的个数

  • 应用场景:文本分类(情感分析等)

API:

  • sklearn.naive_bayes.MultinormialNB(alpha=1.0)
    • alpha=:拉普拉斯平滑系数(默认=1.0)

    • MultinormialNB.fit(x_train , y_train):训练

    • MultinormialNB.predict(x_test):预测

    • MultinormialNB.score(x_test, y_test):评估

代码示例:

news = fetch_20newsgroups(subset="all") # 获取数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, random_state=11) # 划分数据集

# 特征工程:文本特征抽取(Tf-idf)
trans = TfidfVectorizer()
x_train = trans.fit_transform(x_train)
x_test = trans.transform(x_test)
print("type of x_test:", type(x_test))

# 朴素贝叶斯算法
esti = MultinomialNB()
esti.fit(x_train, y_train)

# 模型评估
    # 方法1:
y_pred = esti.predict(x_test) # 预测
print("y_predict =", y_pred)
accuracy_1 = np.sum(y_pred == y_test)/sum(np.ones(y_test.shape))
print("accuracy_1 =", accuracy_1) # 计算准确率

    # 方法2:
accuracy_2 = esti.score(x_test, y_test) # 计算准确率
print("accuracy_2 =", accuracy_2)

输出:
image.png

  • 优点
    • 稳定的分类效率
    • 对缺失值不太敏感,算法简单
    • 速度快
  • 缺点
    • 由于假设特征之间相互独立,所以当特征关联性强的时候效果差

4、决策树

  • 按照类似if…else…的结构分割数据,按顺序高效决策

  • 需要决定按照特征的先后顺序

  • 信息论基础:

    • 信息熵
    • 信息增益:g(D , A) = 总信息熵 H(D) - 条件熵 H(D|A)
      image.png
  • 根据不确定度减少最多的特征排序判断,也就是信息增益最大排序的特征判断

API:

  • sklearn.tree.DecisionTreeClassifier(criterion= , max_depth= , random_state= )

    • 决策树分类器
    • 参数:
      • criterion=:决策树划分依据,默认’gini’,可以选信息增益’entropy’
      • max_depth=:树的深度大小,默认None(拟合所有特征,可能会过拟合)
      • random_state=:随机数种子
  • 决策树的可视化

    • sklearn.tree.export_graphviz(estimator , out_file=’xxx.dot’ , feature_names=[‘ ‘ , ‘ ‘])

      • estimator:需要导出的训练好的预估器
      • out_file=:导出文件的名字,格式为.dot
      • feature_names=:导出的特征名字
    • 可以在网站webgraphviz中打开.dot文件查看树的形状,也可以在vscode中安装插件Graphviz Interactive Preview预览

  • 优点:可视化,可解释能力强

  • 缺点:过于深的树容易过拟合

  • 改进:减枝cart算法,随机森林

  • 应用范围:企业决策

- 案例:泰坦尼克号乘客生存预测

具体代码见Python>MachineLearning文件中的==titanic.ipynb==文件

5、随机森林

  • 防止决策树出现过拟合
  • 集成学习算法:建立几个模型组合解决单一预测问题,最后预测的结果取几个模型预测结果的众数
  • 随机森林:包含多个决策树的分类器,结果由多个决策树结果的众数决定
  • 两个随机:(保持每个决策树的独立)
    1. 训练集随机
      • BootStrap抽样:在N个样本中随机有放回抽样抽N个,组成新训练集,抽到的新训练集可能有重复样本
    2. 特征随机
      • 在M个特征中随机有放回抽样抽m个,组成新特征集,抽到的新特征集可能有重复特征(M>>m
      • 优点:降维,运算速度快,防止过拟合,但不损失正确率

API:

  • sklearn.ensemble.RandomForestClassifier(参数):

    • 参数
      • n_estimators:树木数量,默认为10
      • criterion=:决策树划分依据,默认’gini’
      • max_depth=:树的深度大小,默认None
      • bootstrap=:是否随机有放回抽样,默认True
      • max_features=:每个决策树的最大特征数量
        • ‘auto’ 或 ‘sqrt’:m=sqrt(M)
        • ‘log2’:m=log2(M)
        • None:m=M(一般不用)
      • random_state=:随机数种子
  • 优点

    • 具有极好的准确率
    • 适用于大数据场景,能处理高维特征的输入样本
    • 能评估每个特征在分类问题上的重要性

文章作者: Nefelibata BIGR
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Nefelibata BIGR !
  目录