机器学习基础算法2 - 机器学习算法概述及分类算法

  • 机器学习算法分类

    监督学习:输入数据有特征也有标签值
    分类:k-近邻算法、贝叶斯分类、决策树与随机森林、逻辑回归、神经网络
    回归:线性回归、岭回归
    标注:隐马尔可夫模型

    无监督学习:输入数据有特征但无标签值
    聚类:k-means

  • 机器学习开发流程
    (1)收集原始数据,明确需解决问题
    (2)数据的基本处理(缺失值、合并等)
    (3)特征工程
    (4)找到合适的算法建立模型
    (5)模型的评估,判断效果
    (6)若效果不好,继续重复(3)、(4)、(5)步

  • 机器学习数据集
    训练集:用于训练,构建模型
    测试集:用于检验,评估模型是否有效
    训练集:测试集 = 75%:25% (一般)
    数据集划分API:sklearn.model_selction.train_test_split

    from sklearn.datasets import load_iris
    from sklean.model_selection import tran_test_split
    
    li = load_iris()
    x_train, x_test, y_train, y_test = train_test_split(li.data, li.target, test_size=0.25)
    

  • 转换器与估计器

    -1- 转换器

    在这里插入图片描述

    from sklean.preprocessing import StandardScaler
    
    # 直接调用fit_transform
    s = StandardScaler()
    s.fit_transform([[1,2,3],[4,5,6]])
    
    # 先调用fit再调用transform
    ss = StandardScaler()
    ss.fit([[1,2,3],[4,5,6]])  # 根据导入数据计算相关参数
    ss.transform([[1,2,3],[4,5,6]])  # 代入参数完成转换
    

    -2- 估计器
    用于分类的估计器:
    sklearn.neighbors k-近邻算法
    sklearn.naive_bayes 贝叶斯
    sklearn.linear_model.LogisticRegression 逻辑回归

    用于回归的估计器:
    sklearn.Linear_model.LinearRegression 线性回归
    sklearn.linear_model.Ridge. 岭回归

    在这里插入图片描述
    -3- 集成学习
    建立多个模型组合解决单一预测问题,原理是生成多个分类器或模型,分别独立的对结果进行预测,最后将各单预测结果组合为最终结果。


分类算法

  • k-近邻算法(KNN) (sklearn.neighbors.KNeighborClassifier)
    利用新样本在特征空间中的k个最邻近的样本大多数属于的类别作为该新样本的类别。
    两个样本之间的距离可以用欧式距离计算,计算前需要进行标准化
    在这里插入图片描述

    from sklearn.model_selection import train_test_split, GridSearchCV
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.preprocessing import StandardScaler
    
    def knncls():
        """
        K-近邻预测用户签到位置
        :return:None
        """
        # 读取数据
        data = pd.read_csv("./data/FBlocation/train.csv")
    
        # 处理数据
        # 1、缩小数据,查询数据晒讯
        data = data.query("x > 1.0 &  x < 1.25 & y > 2.5 & y < 2.75")
    
        # 处理时间的数据
        time_value = pd.to_datetime(data['time'], unit='s')
    
        # 把日期格式转换成 字典格式
        time_value = pd.DatetimeIndex(time_value)
    
        # 构造一些特征
        data['day'] = time_value.day
        data['hour'] = time_value.hour
        data['weekday'] = time_value.weekday
    
        # 把时间戳特征删除
        data = data.drop(['time'], axis=1)
    
        # 把签到数量少于n个目标位置删除
        place_count = data.groupby('place_id').count()
    
        tf = place_count[place_count.row_id > 3].reset_index()
    
        data = data[data['place_id'].isin(tf.place_id)]
    
        # 取出数据当中的特征值和目标值
        y = data['place_id']
        x = data.drop(['place_id'], axis=1)
    
        # 进行数据的分割训练集合测试集
        x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    
        # 特征工程(标准化)
        std = StandardScaler()
    
        # 对测试集和训练集的特征值进行标准化
        x_train = std.fit_transform(x_train)
    
        x_test = std.transform(x_test)
    
        # 进行算法流程 # 超参数
        knn = KNeighborsClassifier()
    
        # # fit, predict,score
        # knn.fit(x_train, y_train)
        #
        # # 得出预测结果
        # y_predict = knn.predict(x_test)
        #
        # print("预测的目标签到位置为:", y_predict)
        #
        # # 得出准确率
        # print("预测的准确率:", knn.score(x_test, y_test))
    
        # 构造一些参数的值进行搜索
        param = {"n_neighbors": [3, 5, 10]}
    
        # 进行网格搜索
        gc = GridSearchCV(knn, param_grid=param, cv=2)
    
        gc.fit(x_train, y_train)
    
        # 预测准确率
        print("在测试集上准确率:", gc.score(x_test, y_test))
    
        print("在交叉验证当中最好的结果:", gc.best_score_)
    
        print("选择最好的模型是:", gc.best_estimator_)
    
        print("每个超参数每次交叉验证的结果:", gc.cv_results_)
    
        return None
    

    k值取值影响:
    k值取值很小:容易受异常点影响
    k值取值很大:容易受样本总体类别分布影响

    k近邻算法优缺点:
    优点: 简单,易于理解和实现,无需参数估计,无需训练
    缺点: 属于懒惰算法,计算量大,内存开销大。必须人为选择k值,分类精度很大程度取决于k值的选择。
    使用场景: 小数据场景

  • 朴素贝叶斯 (sklearn.naive_bayes.MultinomialNB)
    前提: 特征相互独立
    基本原理: 利用贝叶斯公式求得给定特征下,目标分别为每一种类别的概率,取概率最大的类别作为预测结果。
    在这里插入图片描述 在求P(Fi|C)时,某些特征词容易求得出现概率为0,此时使用拉普拉斯平滑解决。
    在这里插入图片描述

    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.metrics import classification_report
    	
    def naivebayes():
        """
        朴素贝叶斯进行文本分类
        :return: None
        """
        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()
    
        # 以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
        x_train = tf.fit_transform(x_train)
    
        print(tf.get_feature_names())
    
        x_test = tf.transform(x_test)
    
        # 进行朴素贝叶斯算法的预测
        mlt = MultinomialNB(alpha=1.0)
    
        print(x_train.toarray())
    
        mlt.fit(x_train, y_train)
    
        y_predict = mlt.predict(x_test)
    
        print("预测的文章类别为:", y_predict)
    
        # 得出准确率
        print("准确率为:", mlt.score(x_test, y_test))
    
        print("每个类别的精确率和召回率:", classification_report(y_test, y_predict, target_names=news.target_names))
    
        return None
    

    朴素贝叶斯优缺点:
    优点: 源于古典数学理论,有稳定的分类效率;对缺失数据不敏感,算法简单,无需调参,常用于文本分类;分类精确度高,速度较快。
    缺点: 使用了样本特征间相互独立的假设,在假设不满足时,即特征间相互关联时效果不好。

  • 决策树

  • 信息论

    (1)信息熵H:单位为比特bit,反应不确定性和混乱程度。信息和消除不确定性是相关联的
    在这里插入图片描述
    (2) 信息增益
    因得知特征A,使得集合D的信息熵的不确定性减少。
    在这里插入图片描述
    (3)决策树特征选择原则
    ID3:信息增益最大原则
    C4.5:信息增益比最大原则
    CART:回归树 - 平方误差最小,分类数 - 基尼系数最小

  • 决策树(sklearn.tree.DecisionTreeClassifier)

    def decision():
        """
        决策树对泰坦尼克号进行预测生死
        :return: None
        """
        # 获取数据
        titan = pd.read_csv("http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt")
    
        # 处理数据,找出特征值和目标值
        x = titan[['pclass', 'age', 'sex']]
    
        y = titan['survived']
    
        print(x)
        # 缺失值处理
        x['age'].fillna(x['age'].mean(), inplace=True)
    
        # 分割数据集到训练集合测试集
        x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25)
    
        # 进行处理(特征工程)特征-》类别-》one_hot编码
        dict = DictVectorizer(sparse=False)
    
        x_train = dict.fit_transform(x_train.to_dict(orient="records"))
    
        print(dict.get_feature_names())
    
        x_test = dict.transform(x_test.to_dict(orient="records"))
    
        # 用决策树进行预测
        dec = DecisionTreeClassifier(max_depth = 10)
        
        dec.fit(x_train, y_train)
        
        # # 预测准确率
        print("预测的准确率:", dec.score(x_test, y_test))
        
        # 导出决策树的结构
        export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
    

    决策树优缺点
    优点: 易于理解和解释,可以可视化;需要的数据准备很少,不需要归一化等操作。
    缺点: 易发生过拟合
    改进: 剪枝cart算法、随机森林

  • 随机森林 (sklearn.ensemble.RandomForestClassifier
    随机森林是有多个决策树组成的集成学习方法,其返回结果为所有决策树结果的多数。
    在这里插入图片描述
    随机不放回抽样:保证每个决策树的训练集不同,以平均的方式减小预测的方差,消除各决策树的有偏性。
    超参数:树的棵树,树的深度,最大特征数等。

    在这里插入图片描述

    from sklearn.ensemble import RandomForestClassifier
    
    # 随机森林进行预测 (超参数调优)
    rf = RandomForestClassifier()
    
    param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth": [5, 8, 15, 25, 30]}
    
    # 网格搜索与交叉验证
    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_)
    
    return None
    
    

    随机森林优缺点:
    优点: 可同时处理分类或数值特征,具有极好的准确率;适用于大数据集(样本数大、特征数大);不需要降维,能够确定不同特征的重要性。
    缺点: 计算成本高,学习时间长,如训练数据中存在噪声,容易发生过拟合。


  • 分类模型的评估(sklearn.metrics.classification_report)
    1. 准确率 (estimator.score())
    2. 混淆矩阵 (Confusion Matrix)在这里插入图片描述
    3. 精确率 (precision) 和召回率 (recall)
    在这里插入图片描述
    4. 稳健性 (F1-score)
    在这里插入图片描述

  • 模型选择与评优

  1. 交叉验证 (Cross Validation)
    将数据等分为n份,其中一份作为验证集,其余作为训练集。进行n次模型训练,每次选择不同的验证集,得到n组实验结果,以这些结果的均值作为最终结果,又称为n则交叉验证。
    在这里插入图片描述
  2. 网格搜索 (Grid Search) / 超参数搜索 (sklearn.model_selection.GridSearchCV)
    模型中需要人工选择的参数 称为超参数 (hyperparameter)。超参数的选择可以通过网格搜索来实现,对每组超参数进行交叉验证(一般为十折交叉验证),取结果最好的一组超参数作为最终选择的超参数。
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值