小言_互联网的博客

机器学习各种算法以及开发具体流程+API具体实例+案例的实现

1122人阅读  评论(0)

<机器学习算法分类以及开发流程>

本可儿不才,最近学习机器学习和深度学习的算法之余总结了一点小经验,供大家参考。排版还有待提高厚~~

离散型(不可分)--连续型(预测类别,票房等等)

一、

(1)
    
    【1、监督学习: 特征值 + 目标值。   2、 非监督学习: 特征值 1000个样本】

机器学习算法的分类:

1监督学习(预测)重点
    //

    分类:k-近邻算法,贝叶斯分类,决策树与随机森林,逻辑回归,神经网络(目标是离散型)(样本属于哪一个类别)

    //大多数算法应用非常广泛,一定要学好

    回归:线性回归,岭回归 (目标值连续型,具体的值)  连续型
    //

    标注:隐马尔可夫模型(不做要求)

2、无监督学习
    聚类。k-means (只有特征值。什么都没有的)

应用: 银行,图像,文本,贷款吗,票房,      预测价格,股票
        预测具体的气温,年龄扽等 (回归)   预测天气是晴天还是阴天:(分类问题)

(2)
    机器学习开发流程。         《数据》
                    1、公司本身就有的数据
                    2、合作过来的数据(和银行的合作数据,情感分析)
                    3、购买的数据(很少)
                爬虫爬数据需要提前定好。但是不能随便想爬什么就爬什么


    原始数据:   
            1、明确问题是做什么的,建立模型:根据数据类型划分应用种类
               分类问题还是回归问题

            2、 表的合并pd取处理数据,前读取pd.red_csv
                                        pd.merge合并

                数据的基本处理 :合并表,缺失值

            3、(主要)特征工程
                对每个特征进行处理

                对特征进行处理,标准化,归一化。文本转化数字,fit_transform

            4、找到合适的算法去进行预测分析(使用算法)

         什么是模型?   算法 + 数据 (抽象)

             5、 

             模型的评估过程。,不能讲拿来就用。(不断提高模型的准确性 95%以上)

             如果模型评估没有合格,则需要换其他比较好的算法(调整参数)
                 if (==false)
                     特征工程继续改变,影响因素,增加特征,删除
《前提。明确问题。分裂回归还是聚类》

             模型评估 ➡️ 上线使用 (以API形式提供)


知识点回顾:

             CountVectorizer       Tf idf。//////用这个

             特征预处理:对于数值型的数据需要归一化标准化,主成分分析

            归一化(目的):避免某一个特征对最终结果造成影响

            特征的降维:把特征值减少。1、特征选择 (删除低方差特征)
                                  2、主成分分析(PCA:特征数量>=100)


            有监督(有特征有目标值),无监督 (无目标,只有特征)

            分类:离散
            回归:连续

            聚类:

课程第二天:  (内容重要并且多)
            1、sklearn数据集与估计器
            2、分类算法-k-近邻算法
            3、k-近邻算法实例
            4、分类模型评估
            5、分类算法-朴素贝叶斯算法  (分类算法:重点)
            6、朴素贝叶斯算法实例
            7、模型选择和调优   (重点)
            8、决策树余随机森林


            (一)
                1、数据的获取pd
                2、数据集的划分
                3、数据及的接口介绍
                4、分类和回归数据集(重点)

        问题:1、如果拿到数据全部都用于训练一个模型?

            数据  (拿一部分数据取训练) (拿一些未知的数据评估)

            (训练集(多)  -  测试集(少))     比例: 70% :30% / 80% :20% / 75%: 25%(使用最多)

            2、划分训练集合测试集是什么意思?

            把样本给划分一部分给测试集  

            训练集(建立模型)      测试集(评估模型,建议模型效果是否好不好)


            3、划分的API :sklearn。model_seletion.train_test_split       训练测试分来


    (二)
        sklearn 数据集api介绍
                            sklearn。datasets                     。。加载获取流行数据集
                            datasets,load_*()                  ..规模小的数据集
                            datasets,fetch_*(data_home=None)    。。 规模大的数据集
                            默认下载目录是 ~/scikit_learn_data/

                获取数据格式:
                            load* fecth* 都是字典数据
                            [n_sample * n_features]

                            提前实例化好

                            print(xxx.data)    特征值        二维的numpy.ndarray     
                            print(xxx.target)  目标值            标签数组  二维的numpy.ndarray

                            print(xxx.DESCR) //特征的属性含义

                            也可以单独获取
                            feature_names:特征名
                            target_names:标签名


                sklearn分类数据集(目标值是离散型的,具体的数值)
                                sklearn,datasets.load_iris() 加载鸢尾花数据集
                                sklearn.datasets.load_digits() 加载并返回数字数据集

                数据集的分割:
                            sklearn.model_seletion.train_test_split()
                            参数:x数据集的特征值,     y训练集的特征值 
                            test_size 测试集的大小  0.2 float
                            random_state
                            return 

                            特征值x的训练集和测试集,目标值y的训练集和测试集
     x_train, x_test, y_train, y_test = train_test_split(li.data , li.target, test_size=0.25)

                用于分类的大数据集:新闻数据集
                            (已经下载好了,世直接实例就好了fetch_20newsgroups)
                            slklearn,daatsets.fetch_20newsgroups(data_home=None,subset='train')
                            datasets.clear_data_home(data_home=None)

                sllearn回归数据集

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

                        sklearn.datasets_load_diabetes()  获取并返回糖尿病数据集 


                进行数据的转换:transform

                            fit_transform 输入数据直接转化为数值  
                            fit():输入数据  transform()转化数据
from sklearn.preprocessing import StandScaler
s = StandScaler()
s,fit_transform([[],[],[]])
直接进行数据转化
先用standardScaler()实例化再用fit_transform([])进行标准化和转化


        (三)估计器:算法的实现,实线算法的api                          


  
  1.   1、用于分类的估计器:
  2.                                             sklearn.neighbors  k-近邻算法
  3.                                             sklearn.naive_bayes  贝叶斯
  4.                                             sklearn.linear_model.LogosticRegression 逻辑回归
  5.                                             sklearn.tree   决策树余随机森林
  6.   2、用于回归的估计器:
  7.                                             sklearn.linear_model.LinearRegression 线性回归
  8.                                             sklearn.linear_model.Ridge  岭回归

门槛:每隔算法api中的参数,传入算法的参数以及属性。了解哪些参数需要传

                
                估计器的流程:

                训练集     测试集    


          extamitor 估计器 :流程与transform类似 (x_train, y_train)

                        1、调用fit(x_train, y_train)  //可以用

                        2、输入预测数据(测试集) x_test, y_test
                                                    y_predict = predict(x_test) //预测目标值
                        
                        3、预测准确率:score(x_text, y_test)


(1)分类算法-k近邻算法(knn) 1960年提出(简单)

                    需要标准化

                    1、    定义:一个样本中k个最相似(特征宽假中最邻近)的样本的大多数属于某一个类别,则该样本也属于这个类别

                    2、欧式距离:比如说a(a1,a2,a3)b(b1,b2,b3)
                    (a1-b1)^2+(a2-b2)^2+(a3-b3)^2 开根号

            结合之前的例子,计算两个样本距离的特征有什么影响?需要对数据做些什么?

                        标准化: preprocession StandardScaler


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

                    n_neighbors:查询默认使用的邻居数
                    algorithm:可选用余计算最近邻居的算法 BallTree    kd_tree=KDTree传递参数
 

举例:k-近邻实例预测住房数据 (分类问题)

 

 


  
  1. import numpy as np
  2. import pandas as pd
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.neighbors import KNeighborsClassifier
  5. from sklearn.preprocessing import StandardScaler
  6. def knncls():
  7. """
  8. k-近邻预测用户签到位置
  9. :return: None
  10. """
  11. # 读取数据
  12. data = pd.read_csv( "/Users/wusibin/Downloads/热身赛数据/01-12/chongzhi_beier-east-01-12.csv")
  13. # print(data.head(10))
  14. # print(data.head(20))
  15. #处理数据
  16. #缩小数据,查询数据筛选
  17. data = data.query( "x> 1.0 & x < 1.25, y>1.0 & y<1.25")
  18. #处理时间的的数据
  19. time_value = pd.to_datetime(data[ 'time'], unit= 's')
  20. print(time_value)
  21. #把日期格式转换成字典格式
  22. time_value = pd.DatetimeIndex(time_value)
  23. # 构造一些特征
  24. data[ 'date'] = time_value.day
  25. data[ 'hour'] = time_value.hour
  26. data[ 'weekday'] = time_value.weekday
  27. #把时间戳特征删除
  28. data.drop([ 'time'], axis= 1)
  29. print(data)
  30. #把签到数量少于n的目标位置删除
  31. place_count= data.groupby( 'place_id').count()
  32. tf = place_count[place_count.row_id > 3].reset_index()
  33. data = data[data[ 'place_id'].isin(tf.place_id)]
  34. #去除数据当中的特征值和目标值
  35. y = data[ 'place_id']
  36. x = data.drop([ 'place_id'], axis= 1)
  37. #把数据分成训练集和测试集
  38. x_train,x_test,y_train,y_test = train_test_split(x, y, test_size= 0.25)
  39. #特征工程(标准化)
  40. # data['day'] =
  41. std = StandardScaler()
  42. #对测试集合训练集进行标准化
  43. x_train = std.fit_transform(x_train)
  44. x_test = std.transform(x_test)
  45. #进行算法流程
  46. knn = KNeighborsClassifier(n_neighbors= 5)
  47. #fit ,predict,acore
  48. knn.fit(x_train, y_train)
  49. #得出预测结果
  50. y_predict= knn.predict(x_test)
  51. print( "预测目标签到位置为:",y_predict)
  52. # 得出一个准确率
  53. print( "预测的准确率:",knn.score(x_test,y_test))
  54. return None
  55. if __name__ == "__main__":
  56. knncls()


            强调:以下的方法不一定对,需要看训练后的结果怎么样。

            特征值:x,y 坐标,定位准确性,时间戳,日,时,周       目标值:入住位置的id

                        处理:   0<x<10   0<y<10
                            1、由于数据量大,节省时间x,y缩小

                            2、时间戳进行处理,看最后的效果。
                            效果不好就不处理。(年、月、日、周、时、分秒),当做新特征放入数据里

                            3、入住位置特别多(几千,几万个),导致预测准确率低。少于指定的亲到人数的位置删除

data.query(""),里面翻条件,大于多少小于多少,,索引去查询数据

pd.to_datetime()  把时间戳转换成时间年月日

数据的处理:
        1、缩小数据集的范围
        Dataframe.query()

        2、处理日期数据
        pd.to_datetime
        pd.Datetimeindex

        3、删除没用的日期数据
        DataFrame.drop

        5、将签到位置少于n个用户的删除
        data.groupby('place_id').count[] tf = place_count[place_count.row_id >3].reset_index()
        data = data[data['place_id'].isin(tf.place_id)]


.reset_index()、把索引变成某一列

        总结:
                问题:
                    1、k值去多大?有什么影响?

                        k值去很小:容易受异常点的影响

                        k值取很大:容易受样本,k值 数量里面的类别的影响的波动


                    2、性能问题?

                        时间复杂度,样本越大,时间复杂度越高。所以需要手动调参。特别麻烦

                        参数需要调优,参数对结果造成影响。所以需要调优

        总结:
                1、优点:简单易于实现理解,无需参数,无需训练。估计(超参数)
                    算法实例化

                2、缺点:k值取值,以及计算量。

                基本上在实际案例中不用。准确率不高,容易影响计算性能。


分类算法------朴素贝叶斯

    1、概率基础     2、朴素贝叶斯介绍

    应用:垃圾邮件的分类(金融,软件,产品,互联网)找出类别那个可能性概率最高,
         就将这个类别分为所占比例最高的一类的名称


         1、概率基础:根据历史数据预测未来发生的可能性,扔硬币和预测天气

         2、联合概率:包含多个条件,且所有条件同事成立    p(AB)
         2、条件概率:事件A在事件B以及发生的条件下的概率  p(A|B)p(A|B)


         自然语言处理不独立的情况


         朴素贝叶斯----条件(特征)相互独立,否则效果不好
         面试:朴素,条件独立的意思

                    文档分类: 
                            反应主题中心的词:

                            P(科技|词1,词2,词3.。。)  文档:词1,词2,词3.。。。。

                            P(娱乐|词a,词b,词c。。。)  文档:词1 ,词2,词3  。。。

重点:

            (面试)贝叶斯公式:  p(C|W) = P(W|C)P(C) /P(W) 

                                w为给定文档的特征值(),c为文档的类别(给定文档的词)

                                P(C):每个文档类别的概率:(某文档数、总文档数)
                                P(W|C):给定类别下特征(被预测文档中出现的词)的概率

                    但是也会出现概率为0
                            如何解决?

                            拉普拉斯平滑系数  P(F1|C) = Ni+a / N+am 
                            a指定的系数1,m为训练集中统计文档的次数


  朴素贝叶斯分类实现API
                    sklearn.naive_bayes.MultinomalNB(alpha = 1.0)  默认

                    alpha:拉普拉斯平滑系数,防止分类的时候类别的概率为0

    朴素贝叶斯算法案例:
                    sklearn20类新闻分类
                    20个新闻数据集包含20个主题的18000个新闻组帖子

 


  
  1. from sklearn.datasets import fetch_20newsgroups
  2. from sklearn.model_selection import train_test_split
  3. from sklearn.neighbors import KNeighborsClassifier
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.feature_extraction.text import TfidfVectorizer
  6. from sklearn.naive_bayes import MultinomialNB
  7. from sklearn.metrics import classification_report
  8. from sklearn.model_selection import GridSearchCV
  9. from sklearn.tree import DecisionTreeClassifier
  10. import pandas as pd
  11. def naviebays():
  12. """
  13. 朴素贝叶斯分类文本
  14. :return: None
  15. """
  16. news = fetch_20newsgroups(subset= 'all')
  17. # 对数据进行分割
  18. x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size= 0.25)
  19. # 对数据集进行特征抽取
  20. tf = TfidfVectorizer()
  21. # 训练集中对此的列表进行每篇文章的重要性统计['a','b','c','d']
  22. x_train = tf.fit_transform(x_train)
  23. print(tf.get_feature_names())
  24. x_test = tf.transform(x_test)
  25. #进行朴素贝叶斯算法的预测
  26. mlt = MultinomialNB(alpha= 1.0)
  27. print(x_train.toarray())
  28. #sparse的矩阵
  29. mlt.fit(x_train, y_train)
  30. # 以及在api实现了 关于predict的算法
  31. y_predict = mlt.predict(x_test)
  32. print( "预测文章的类别为:", y_predict)
  33. # 得出准确率
  34. print( "准确率为:",mlt.score(x_test,y_test))
  35. print( "每个类别的精确率和召回率:",classification_report(y_test,y_predict,news.target_names))
  36. # classification_report(y_true=,y_pred=,target_names=)
  37. #构造一些参数值进行搜索
  38. param = { "n_neighbors":[ 3, 5, 10]}
  39. # 进行网格搜索 knn无实例,数据需要在官网获取下载
  40. gc = GridSearchCV(knn,param_grid=param,cv= 10)
  41. gc.fit(x_train,y_train)
  42. # 预测准确率
  43. print( "在测试集上的准确率:",gc.score(x_test,y_test))
  44. print( "在交叉验证中最好的结果:", gc.best_score_)
  45. print( "选择最好的模型是:",gc.best_estimator_)
  46. print( "每隔超参数每次交叉验证的结果:",gc.cv_results_)
  47. return None
  48. if __name__ == "__main__":
  49. naviebays()


            流程:
                1、先把数据加载下来fetch——20newsgroups(subsets=0.5)
                    
                    并进行分割陈训练集测试集x_train,y_train,x_test,y_test

                    文本特征抽取

                2、生成文章特征词
                    文本特征抽取

                3、朴素贝叶斯estimator流程进行预估    不需要调参。

                朴素贝叶斯算法受训练集的影响非常大,训练集误差大,结果看到不好

                重要的词如果不具有代表性的话。

                不需要调参。

        总结:
                优点:

                1、分类效率高,准确。只要数据集是准确的
                2、对于缺失数据集不太敏感,少了一个词一个概率影响不大
                3、分类准确率高,无法调参
                4、易于文本分类

                缺点:
                1、假设了文章中的词是具有独立性的,对文章讲不太靠谱
                2、在训练集中进行统计词的工作,会对结果造成较大的干扰。
                只要训练集准备的准确,里面的词具有代表性就效果好

            
            朴素贝叶斯:文本分类
            神经网络:效果更好


    (一)
         分类模型的评估:精确率(准确率)和召回率 
         其他分类标准:F1-score 反应了数据的稳定性

         分类模型评估API:        度量,评估  分类,精确率,召回率
                         sklearn.metrics.classification_report(y_true,y_pred,target_names=Nome)
                         
                         y_true:真实目标值
                         y_pred:估计器预测目标值
                         target——names:目标类别名称
                         return:每个类别进去率余召回率

             实例:
                 print("每个类别的精确率和召回率:",classification_report(y_test,y_predict,news.target_names))

    (二)
        模型的选择余调优 k值,特征值
        
        交叉验证  网格搜索    

        交叉验证,网格搜索搭配使用

        1、交叉验证,为了让评估的模型更加准确可以信

                    所有数据分成n等分(与x_test,y_test,无关系)

                    训练集   训练集    训练集    | 验证集  得出一个模型准确率  模型1

                    训练集   训练集   验证集   | 训练集   得出一个模型准确率  模型2

                    训练集   验证集   训练集   | 训练集   得出一个模型准确率  模型3
                    。。。最后求出模型的品均值的结果为80%

        2、网格搜索---调参数 (调到某一个位置达到的效果最好 )
                            k-近邻:超参数K

                            若超参数不止一个,a[2,3,5,8,10] b[20,70,80] 两两进行组合


            超参数搜索--网格搜索API      交叉验证

             param = {"n_neighbors":[3,5,10]}  这里的参数可调,提前构造出来的参数值

            sklearn.model_selection.GridSearchCV(estimator,param_gird=None,cv=None)
            estimator:估计器对象
            param_grid:估计器参数(dict){"n_neighbors":[1,3,5]}
            fit:输入训练数据
            cv:指定几折交叉验证
            score:准确率

            结果分析:
            best_score:在交叉验证中验证的最好结果
            best——estimator:最好的参数模型
            cv_results_:每次交叉验证后的验证集准确率地结果和训练集的准确率的结果


(三) 分类算法----决策树(随机森林)

        比朴素贝叶斯 和 k近邻准确率高很多,高纬度高特征,数据月复杂优势越明显

                                1、认识决策树
                                2、信息基础-银行贷款分析
                                3、决策树的生成
                                4、泰坦尼克号乘客生存分类

    信息熵----信息和消除不确定性是相联系的(决策树的时间划分)
            哪个减少的信息熵更多就选哪个(以此玩下进行二分,是则继续,否则不分)
                                    例如:决策树的实际划分:有自己的房子(是/否)
                                                    是公务员吗?(否/是)

        
        决策树的划分依据:
                信息和消除不确定性是相互联系的

                    (1)信息增益 
                                当得知一个特征的条件之后,减少的信息熵的大小
                                g(D,A)=H(D)-H(D|A) 
                                g为信息增益
                                H(D) 初始信息熵的大小

                        信息熵的计算
                        条件熵的计算
                        g(D|年龄)=H(D|年龄)= 


                常见的决策树的使用方法
                                       ID3信息增益最大的准则
                                       C4.5 信息增益比 对大的准则
                                       CART
                                       回归树:平方误差最小
                                       分类树:基尼系数 最小准则在sklearn中可以选择划分的默认原则

        sklearn决策树API
                        class sklearn.tree.DecisionTreeClassifier(criterion='gini',max_depth=None,random_state=None)

                        决策树分类器:
                        criterion:默认是'gini'系数,也可以选择信息增益的熵'entropy'
                        max_depth:书店深度大小
                        random_state:随机数种子

                        method:
                        decision_path:返回洁厕书的路径

        案例:泰坦尼克号的分类,预测是生是死。看看预测是否准确

        集成学习方法--随机森林

            泰坦尼克号乘客生死分类模型


  
  1. import pandas as pd
  2. from sklearn.feature_extraction import DictVectorizer
  3. from sklearn.model_selection import train_test_split, GridSearchCV
  4. from sklearn.tree import DecisionTreeClassifier, export_graphviz
  5. from sklearn.ensemble import RandomForestClassifier
  6. def decisionTree():
  7. """
  8. 决策树预测泰坦尼克号的生死
  9. :return: None
  10. """
  11. # 获取数据
  12. titan = pd.read_csv( "http://biostat.mc.vanderbilt.edu/wiki/pub//Main/DataSets/titanic.txt")
  13. # 处理数据,找出特征值和目标值
  14. x = titan[[ 'pclass', 'age', 'sex']]
  15. y = titan[ 'survived']
  16. print(x)
  17. #缺失值的处理,把空值进行填充,求平均值
  18. x[ 'age'].fillna(x[ 'age'].mean(), inplace= True)
  19. # 分割数据到训练集到测试集
  20. x_train, x_test, y_train, y_test = train_test_split(x, y, test_size= 0.25)
  21. # 进行处理 特征工程 特征?》类别的处理---one_hot编码
  22. dict = DictVectorizer(sparse= False)
  23. x_train = dict.fit_transform(x_train.to_dict(orient= "records"))
  24. print(dict.get_feature_names())
  25. x_test = dict.transform(x_test.to_dict(orient= "records"))
  26. # print(x_train)
  27. # 重点,,,用决策树进行预测,并且修改深度5层,超参数,会影响结果
  28. # max_depth深度可调,值越大决策树越少
  29. dec = DecisionTreeClassifier(max_depth= 8)
  30. # 固定步骤,把训练集的目标值和特征值翻入进行
  31. dec.fit(x_train,y_train)
  32. # 预测准确率
  33. # 训练后的成为测试集用dec.score方法预测准确率
  34. print( "预测的准确率:", dec.score(x_test, y_test))
  35. #
  36. # # 导出决策树的结构
  37. # export_graphviz(dec, out_file="./tree.dot", feature_names=['年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', '女性', '男性'])
  38. #
  39. # 随机森林进行预测,超参数调优
  40. rf = RandomForestClassifier()
  41. param = { "n_estimators": [ 120, 200, 300, 500, 800, 1200], "max_depth":[ 5, 8, 15, 25, 30]}
  42. # 网格搜索余交叉验证
  43. gc = GridSearchCV(rf, param_grid=param, cv= 2)
  44. gc.fit(x_train, y_train)
  45. print( "预测准确率:", gc.score(x_test, y_test))
  46. print( "查看选择的参数模型:", gc.best_params_)
  47. return None
  48. if __name__ == '__main__':
  49. decisionTree()

        流程:
            1、pd读取数据
            2、寻找有影响的特征,处理缺失值(填补,按照那一列的品均值进行填补)
            3、进行特种工程,pd转化字典,特征抽取x_train.to_tict(orient="records")
            4、决策树估计器流程

 

        决策树的结构、本地保存

            1、sklearn.tree.export_graphviz()该函数能够导出DOT格式
            tree.export_graphviz(estimator,out_file='tree.dot',feature_names=[","])

            2、工具:(能够将dot文件替换为pdf、png)
                按照graphviz
                mac: brew install graphviz

                运行命令
                $ dot -Tpng tree.dot -o tree.png


    # 导出决策树的结构
    export_graphviz(dec, out_file="/User/wusibin/Downloads/tree.dot", feature_names=['age年龄', 'pclass=1st', 'pclass=2nd', 'pclass=3rd', 'sex=female女性', 'sex=male男性'])


    总结:
         优点:
             1、简单的理解和解释,树木的可视化
             需要很少的数据准备,其他技术通常需要数据归一化


         缺点:
             1、决策树学习者穿件不能很好的推广数据过于复杂的数
             这被称为过拟合


         DecisionTree

         改进:
             1、减枝cart算法(决策树api中以及实现,随机森林参数调优有关的介绍)
                 把最后分的结果砍掉一点,通过api中实现

             2、随机森林  也可以解决过拟合的问题(决策树的原理)

             ps:企业的重要决策,由于决策树很傻的分析能力,在决策过程应用较多(通过信息增益的大小来判断)
                 前三个因素占主要,就用决策树
                 没有进行归一化,数据参数需要修改

  集成学习方法:
                  建立多个模型组合来解决单一的一个问题

              随机森林:
                      包含多个决策树进行分类(随机森林建立多个决策树的过程)

              
              单个树建立过程:
                          1、随机在N个样本中选择一个样本,重复N次,样本有可能重复
                          2、随机在N个样本在选出m个特征。m取值  

                      随机又返回的抽样:bootstrap

     重点:随机森林API(参数有很多)

             ensemble 集成学习方法  n_estimators: int potional(default = 10)
             random随机数

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

             nestimators: 森林里的树木量

             max_depth:(默认=无) 数的最大深度 5,8,15,25,30

             max_features='auto' 每隔决策树的最大特征数量
             //特征数量太多会过拟合
             if "auto ,then 'max_feature=sqrt(n_features)'"

             bootstrap: 博哦了按,optional(default = True)是否在构建树时使用返回抽样,随机有放回


             随机森林的超参数: 
                             n_estimator 决策树的数量
                             max_depth 每颗树的深度限制

总结:
     优点:
         1、没有缺点
         2、具有极高的准确率
         2、有效运行在大数据上
         3、不需要降维
         4、评估各个特征在分类问题上的重要性
         5、使用最多最广泛


复习:
    (三个分类算法)
                    1、数据集的划分   

                    训练集x_train ,y_train  
                    测试集  x_test ,y_test
                    目的,调试好,使得预测结果准确


                    2、sk-learn的api:
                                    estimator 估计器里面

                                    # 随机森林进行预测,超参数调优
                                    rf = RandomForestClassifier()

                                     param = {"n_estimators": [120, 200, 300, 500, 800, 1200], "max_depth":[5,8,15,25,30]}


                    3、算法
                            k-近邻   //重要程度低
                            朴素贝叶斯
                            决策树-随机森林,网格搜索和交叉验证

                            信息熵,信息增益,

                            多了就过拟合


、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、


(第三天)

回归
    1、线性回归     之前是准确率,精确率,召回率

    2、分类算法

    3、非监督学习
                岭回归


                k-means :数据集里面没有目标值怎么去处理 (聚类算法)


回忆回归问题的判定?

    1、【之前的是分类问题:离散,属于哪个类别。每一个数值代表着一个类型】

    2、目标值为连续性,无线划分,某个区间内取得任意数。
        100.35   223.43  

        只要目标值为连续性都可以预测


应用:
        房价(),销售额(影响因素:公司收入,研发的好坏,对特征进行预测),等等
        贷款额度的预测(得到贷款的一个数值,而不是是否能得到贷款)

    举例: 期末成绩= :0.7 X 考试成绩 + 0.3 X 平时成绩(上课出勤率)

    线性回归,寻找一种预测的趋势:二维的直线关系
                                三维:特征,目标值,平面中

                            
                        线性关系的定义:
                                    y = kx + b
                                    加b:伪类是对于单个特征的勤快更加通用


                        多个特征:k1 房子的面积 + k2 房子的位置 + b


    线性关系模型:
                1、一个通过属性(特征)的线性组合来进行预测的函数

                f(x) = w1x3 +w2x3 + w3x3

                w为权重    b为偏置项

        线性回归:
                (简单的线性组合)

                1、特征值余目标值之间进行建模的回归分析 
                2、一元线性回归(一个特征,一个目标值)
                   多元:    

        (一)、属性和权重的一种组合来预测结果

                矩阵:
                    大多数算法的计算基础


         数组:                                                矩阵:

0维          5                                               
1维    【5,2,3,3,322】                        
2维     【2,34,56,345,【】】行和列的格式                        必须是二维结构[[行]列],满足特定运算需求

3维     【【】【】【】】 列表套列表                                矩阵的乘法(神经网络)

                                                            (m行,l列)*(l行,n列)=(m行,n列)
                                                            特征值


                                                  [[1,2,3,4]    [[2],[2],[2],[2]]
                                                  [5,6,7,8]]

                                                    一个特征         一个权重      目标值

                                                   (1行,4列)       ( )      一个样本一个值
                                                                                 (1,1)
                                                                                (100,1)


数组的运算:加法  乘法

numpy: ndarray


从今往后的所有算法都是迭代的算法:

                            回归: 迭代的算法(一步一步取调参,一步一步取更新的算法)

                            神经网络

                            我们只需要用什么方法,和api就行。拿过来能用就可以了。不需要深入了解

专有名词:损失函数: (预测结果与真实结果的 - 第二个预测结果和真实结果的)的平方 从1开始依次递加
                    不断迭代,寻找最优化的w的值

                    方法

                            《统计学习方法》  
                                           算法     策略         优化   ----迭代过程

                                         线性回归  损失函数        

            方法:
                1、正规方程:(不做要求)
                求解: w = (x的转置x)的-1次方 x的转置y
                   缺点:当特征过于复杂,求解速度太慢


                2、最下二乘法之梯度下降
                                    学习率 * 方向


                 正规方程与梯度下降对比?
             sklearn 线性回归方程,梯度下降API

                         sklearn.linear_model.LinearRegression
                         正规方程
                         普通最小二乘法线性回归

                         coef_;回归系数

                         sklearn.linear_model.SGDRegressor
                         通过SGD最小化线性模型

                         梯度下降

        scikit-learn 优点:

                            1、建立模型简单,预测简单

                     缺点:

                             1、算法过程,有些参数都在API内部优化执行好了,不用自己去指定

        TensorFlow框架:

                        封装有高有低,可以自己实现线性回归,学习率,这些参数可以自己手动指定

        

    案例:
        线性回归实例:
                    1、sklearn线性回归正规方程,梯度下降API
                    2、波士顿房价数据集分析流程


  
  1. from sklearn.datasets import load_boston
  2. from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.metrics import mean_squared_error
  6. from sklearn.externals import joblib
  7. def mylinear():
  8. """
  9. 线性回归两种预测房子价格
  10. :return: None
  11. """
  12. # 获取数据
  13. lb = load_boston()
  14. # 分割数据到训练集和测试集 data训练值 target 测试纸
  15. x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size= 0.25)
  16. # 输出的是目标值的训练集和测试集,不是测试值的训练集和测试集
  17. print(y_train,y_test)
  18. # 进行标准化处理(?)目标值是否需要标准化处理?要,标准化处理的结果是所有数据都变得非常非常小权重也小。所以更原来的比起来就小监理损失求解
  19. # inverse_transform 转化成之前的值
  20. # 特征值和目标值都必须进行标准化处理,要处理两个,所以要实例化两个标准化的API
  21. # 标准化测试值
  22. std_x = StandardScaler()
  23. x_train = std_x.fit_transform(x_train)
  24. x_test = std_x.transform(x_test)
  25. # 标准化目标值
  26. std_y = StandardScaler()
  27. # 19版本需要用reshape转化成数组或矩阵的形式 .reshape(-1),,,-1是默认值
  28. y_train = std_y.fit_transform(y_train.reshape( -1, 1))
  29. y_test = std_y.transform(y_test.reshape( 1, -1))
  30. # estimator预测
  31. # 正规方程求解方式预测结果 训练数据
  32. lr = LinearRegression()
  33. lr.fit(x_train, y_train)
  34. # 打印权重参数
  35. print(lr.coef_)
  36. # 预测测试集的发展价格,,这个不能缩小,所以用inverse在std_y下的api,换回原来的值
  37. y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
  38. print( "测试集里面每个房子样本的预测价格:", y_lr_predict)
  39. print( "正规方程的均方误差回归性能的评估:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
  40. # 梯度下降进行房价预测 实例化
  41. sgd = SGDRegressor()
  42. sgd.fit(x_train, y_train)
  43. # 打印权重参数
  44. print(sgd.coef_)
  45. # 保存训练好的模型
  46. joblib.dump(lr, "./temp/test.pkl")
  47. # 预测房价的价格
  48. model = joblib.load( "./temp/test.pkl")
  49. y_predict = std_y.inverse_transform(model.predict_test)
  50. print( "保存的模型预测结果:", y_predict)
  51. # 预测测试集的发展价格,,这个不能缩小,所以用inverse在std_y下的api,换回原来的值
  52. y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
  53. print( "梯度下降测试集里面每个房子样本的预测价格:", y_sgd_predict)
  54. print( "梯度下降正规方程的均方误差回归性能的评估:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
  55. # 岭回归进行实例".
  56. rd = Ridge(alpha= 1)
  57. # 梯度下降进行房价预测 实例化
  58. rd = SGDRegressor()
  59. rd.fit(x_train, y_train)
  60. # 打印权重参数
  61. print(rd.coef_)
  62. # 预测测试集的发展价格,,这个不能缩小,所以用inverse在std_y下的api,换回原来的值
  63. y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
  64. print( "梯度下降测试集里面每个房子样本的预测价格:", y_rd_predict)
  65. print( "梯度下降正规方程的均方误差回归性能的评估:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
  66. return None
  67. if __name__ == "__main__":
  68. mylinear()

 


                分析:影响房子的价格因素:小区犯罪率,空气好坏等等,得出13个权重
                目的:求出这13个权重

需要做标准化处理的算法:
                    k-近邻
                    线性回归


            流程:
                1、获取数据
                2、数据分割
                3、训练与测试集,数据标准化处理(重点)
                    为什么要标准化?
                    因为建立过程,权重和特征都会有影响。数据特征越大影响越大,所以需要做标准化处理

                    # 进行标准化处理(?)目标值是否需要标准化处理?要,标准化处理的结果是所有数据都变得非常非常小
                    特征值和目标值都必须进行标准化处理,要处理两个,所以要实例化两个标准化的API


                4、使用最简单的线性回归模型LinearReggression 和梯度下降估计SGDRegressor对房价进行预测


                19版本要求标准化API转换器,estimator必须是二维的
                # 19版本需要用reshape转化成数组或矩阵的形式 .reshape(-1),,,-1是默认值
                   y_train = std_y.fit_transform(y_train.reshape(-1, 1))
                y_test = std_y.transform(y_test.reshape(1, -1))

        (二)
            回归性能评估:均方误差,与差值余真实值之间差值的平安和求一个平均值

            API:mean_squared_error(y_true,y_pred)
            y_true:真实值
            y_pred:预测值
            return:浮点数结果


------------------------------- ---------------对比--------------------------------------------------------


  梯度下降                                            |                正规方程                                       
需要选择学习率a                                 |                不需要
需要多次迭代                                       |                一次运算出
当特征数量n大是也能很好的使用        |            需要计算很多东西东西东西
适用于各种类型的模型                        |            只适用于线性模型,不适用逻辑回归模型等其他模型

小规模数据LinearRegression                           大规模数据:SGDRegressor

(三)
    过拟合(模型过于复杂)  与  欠拟合(模型过于简单)


    解决办法:
            根据结果现象来判断:
                            比较:交叉验证训练集的结果,网格搜索

欠拟合:测试集,交叉验证,训练集的结果表现不写
过拟合:交叉验证99%,但在测试集就是89%,表现越来越差


            欠拟合:增加数据

            过拟合:在训练的时候学不到什么东西,但是在测试集的时候还是。
                    1、特征选择(消除一些没用的删掉)
                    2、交叉训练(让所有数据都有结果训练):实际无效果
                    3、正则化


            特征选择:
                    1、嵌入式   重点
                    2、包裹时
                    3、过滤式   低方差特征
                    4、正则化
                    5、神经网络
                    6、决策树


线性回归:LinearRegression 容易出现过拟合 因为在训练的过程中伪类把训练集的数据表现更好。

    对线性和非线性都可以去拟合
    对于非线性去拟合最容易出现复杂模型 


    问题?训练数据训练的很好啊,误差也不大,为什么测试集上面有问题呢?    对线性模型模型训练会变成复杂模型


(岭回归)

通过回归解决过拟合:
                线性回归LinearRegression  容易出现过拟合,为了把训练集数据表现根号

                L2正则化: 岭回归  带有正则化的西安新回归  解决过拟合

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

                具有L2 正则化的闲心最小二乘法把二次项的系数趋近于0

                Ridge:

                alpha:正则化力度
                coef_:回归系数


        岭回归:正则化,把高次项系数不断趋近于0 

        总结:

            岭回归LinearRession 与Ridge对比

            岭回归与闲心回归的比较一定要在数据中才能体现出来

            具有L2 正则化的闲心最小二乘法把二次项的系数趋近于0

            岭回归得到的回归系数更符合实际。林外,能让估计参数的波动更稳定,变化小,又有实用价值

第二天总结:  思维导图存于桌面机器学习文件夹里面

        (一)
            模型的保存与加载
            API: from sklearn.externals.import  joblib
            joblib 模块

            保存: joblib.dump(rf, 'test.pkl')

            加载:estimator = joblib.load('test.okl') 

            ps:sklearn里面固定保存的文件格式


        (二)逻辑回归

                    1、线性回归的输入------>分类问题   (逻辑回归)

                    2、sigmoid函数 (要求计入其样子)
                                                    值为 0-1 之间(具体的概率值) 


                    3、
                        逻辑回归的损失:    信息熵越小预测越准确,100%确定,信息熵为0
                        

                        梯度下降求解:损失函数的最低点

                        损失函数:均方误差(不存在局部最低点)只有一个最小值

                        对数似然损失:
                                    方法:使用梯度下降关系 

                        梯度下降求解:
                                    1、多次随机初始化,多次比较最小值结果
                                    2、求解过程当中,调整学习率
                                    (尽量改善,但不能解决最终问题)
                                    尽管没有全局最低点,但效果哦还是不错的

                正规方程与梯度下降的对比?


        逻辑回归API:
                    sklearn.linear_model.LogisticRegression(penalty='12',c=1.0) 
                    Logistic 回归分类器
                    coef_:回归系数


        逻辑回归案例:

                    良性、恶性乳腺癌肿瘤
                    数据描述:699个氧泵,一共11列数组,第一列用语言检索id,后9列分别是与肿瘤相关的医学特征


  
  1. from sklearn.datasets import load_boston
  2. from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge, LogisticRegression
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.preprocessing import StandardScaler
  5. from sklearn.metrics import mean_squared_error, classification_report
  6. from sklearn.externals import joblib
  7. import pandas as pd
  8. import numpy as np
  9. def mylinear():
  10. """
  11. 线性回归两种预测房子价格
  12. :return: None
  13. """
  14. # 获取数据
  15. lb = load_boston()
  16. # 分割数据到训练集和测试集 data训练值 target 测试纸
  17. x_train, x_test, y_train, y_test = train_test_split(lb.data, lb.target, test_size= 0.25)
  18. # 输出的是目标值的训练集和测试集,不是测试值的训练集和测试集
  19. print(y_train,y_test)
  20. # 进行标准化处理(?)目标值是否需要标准化处理?要,标准化处理的结果是所有数据都变得非常非常小权重也小。所以更原来的比起来就小监理损失求解
  21. # inverse_transform 转化成之前的值
  22. # 特征值和目标值都必须进行标准化处理,要处理两个,所以要实例化两个标准化的API
  23. # 标准化测试值
  24. std_x = StandardScaler()
  25. x_train = std_x.fit_transform(x_train)
  26. x_test = std_x.transform(x_test)
  27. # 标准化目标值
  28. std_y = StandardScaler()
  29. # 19版本需要用reshape转化成数组或矩阵的形式 .reshape(-1),,,-1是默认值
  30. y_train = std_y.fit_transform(y_train.reshape( -1, 1))
  31. y_test = std_y.transform(y_test.reshape( 1, -1))
  32. # estimator预测
  33. # 正规方程求解方式预测结果 训练数据
  34. lr = LinearRegression()
  35. lr.fit(x_train, y_train)
  36. # 打印权重参数
  37. print(lr.coef_)
  38. # 预测测试集的发展价格,,这个不能缩小,所以用inverse在std_y下的api,换回原来的值
  39. y_lr_predict = std_y.inverse_transform(lr.predict(x_test))
  40. print( "测试集里面每个房子样本的预测价格:", y_lr_predict)
  41. print( "正规方程的均方误差回归性能的评估:", mean_squared_error(std_y.inverse_transform(y_test), y_lr_predict))
  42. # 梯度下降进行房价预测 实例化
  43. sgd = SGDRegressor()
  44. sgd.fit(x_train, y_train)
  45. # 打印权重参数
  46. print(sgd.coef_)
  47. # 保存训练好的模型
  48. joblib.dump(lr, "./temp/test.pkl")
  49. # 预测房价的价格
  50. model = joblib.load( "./temp/test.pkl")
  51. y_predict = std_y.inverse_transform(model.predict_test)
  52. print( "保存的模型预测结果:", y_predict)
  53. # 预测测试集的发展价格,,这个不能缩小,所以用inverse在std_y下的api,换回原来的值
  54. y_sgd_predict = std_y.inverse_transform(sgd.predict(x_test))
  55. print( "梯度下降测试集里面每个房子样本的预测价格:", y_sgd_predict)
  56. print( "梯度下降正规方程的均方误差回归性能的评估:", mean_squared_error(std_y.inverse_transform(y_test), y_sgd_predict))
  57. # 岭回归进行实例".
  58. rd = Ridge(alpha= 1)
  59. # 梯度下降进行房价预测 实例化
  60. rd = SGDRegressor()
  61. rd.fit(x_train, y_train)
  62. # 打印权重参数
  63. print(rd.coef_)
  64. # 预测测试集的发展价格,,这个不能缩小,所以用inverse在std_y下的api,换回原来的值
  65. y_rd_predict = std_y.inverse_transform(rd.predict(x_test))
  66. print( "梯度下降测试集里面每个房子样本的预测价格:", y_rd_predict)
  67. print( "梯度下降正规方程的均方误差回归性能的评估:", mean_squared_error(std_y.inverse_transform(y_test), y_rd_predict))
  68. return None
  69. def logistic():
  70. """
  71. 逻辑回归左细胞分类的预测
  72. :return:
  73. """
  74. # pd.merge( )
  75. # 构造列明标签名字,
  76. column = [ 'time_date', 'street', 'direction', 'car1', 'car2']
  77. #以下的数据可能有误差
  78. data = pd.read_csv( "/Users/wusibin/Downloads/热身赛数据/01-12/chongzhi_beier-east-01-12.csv",names=column)
  79. # data = pd.read_csv("https://archive.ics.uic.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",names=column)
  80. print(data)
  81. # 缺失值进行处理 缺失值是?号,替换?号 替换成np.nan
  82. data.replace(to_replace= '?', value=np.nan)
  83. # 删除空缺值
  84. data = data.dropna()
  85. # 进行数据的分割 评判 找特征值
  86. x_train,x_test,y_train,y_test = train_test_split(data[column[ 1: 10]],data[column[ 10]],test_size= 0.25)
  87. # 进行标准化处理
  88. std = StandardScaler()
  89. x_train = std.fit_transform(x_train)
  90. x_test = std.transform(x_test)
  91. # 逻辑回归预测
  92. lg = LogisticRegression(C= 1.0)
  93. lg.fit(x_train, y_train)
  94. y_preditc = lg.predict(x_test)
  95. print(lg.coef_)
  96. print( "准确率:", lg.score(x_test,y_test))
  97. print( "召回率:", classification_report(y_test,y_preditc,labels =[ 2, 4],target_names=[ "良性", "恶性"]))
  98. return None
  99. if __name__ == "__main__":
  100. # mylinear()
  101. logistic()

            流程:
                1、网上获取数据(工具pandas)
                2、数据缺失值的处理、标准化
                3、LogisticRegression 估计器流程


    pandas的使用:
                pd.read_csv(",names=column_names")
                类别的名字
                column_names=['Sample code number','clump thichks','....','.......']
                replace(to_place",value=):返回数据

                cv是代表交叉验证

    总结逻辑回归:
                只能解决二分类问题:
                                应用: 广告点击率预测,是否患病,金融诈骗,是否为虚假账号

                                1、优点:适合需要得到一个分类概率的场景,建档,速度快

                                2、缺点:不好处理多分类问题


    多分类问题:神经网络

                    1、softmax方法-逻辑回归咋更多分类问题上的推广

                    生成模型和判别模型

                    逻辑回归                                 朴素贝叶斯  

    解决问题               二分类                                文本分类
    应用场景         癌症,二分类需要的概率                    文本分类问题
    参数              正则化力度                            没有
                    得出的结果都有概率解释

判别模型:

        判别模型的依据:
        是否有先验概率:是否从历史依据中总结出来的概率信息

        如果不需要总结就称之为判别模型


        1、决策树,随机森林,神经网络,k-近邻  (先验概率)

        2、隐马尔可夫模型


基本的分类和回归算法都已经完毕了

softmax方法逻辑回归在多分类问题上的推广---将在后面的神经网络算法中介绍


非监督学习算法:(聚类  k-means )
            1、没有目标值,只有特征值(不适用来预测)
            2、把相近特征的数据归为一个类别(物以类聚,人以群分)


    聚类:k把数据划分成多少个类别,
                            1、知道类别个数
                            2、不知道类别个数      超参数


                k-means步骤:

                举例:
                    1、k=3 在1000多个样本中取出三个样本,当做三个类别的中心点(    k1,k2,k3)
                    2、计算其余的点,分别到这三个中心点的举例(a,b,c),每一个样本有三个距离,从中选出距离最近的一个点,作为自己的一个标记(形成了三个族群)//简单的聚类过程
                    3、分别计算这三个族群的平均值,把三个品均值与之前的三个旧中心点进行比较
                                            绿1(x1,x2) 绿2(x2,x2) 平均值(x1平,x2平)

                        如果相同: 结束聚类
                        如果不相同:把这三个平均值单做新的中心点,重复第二步骤

                    k-means API          聚类 
                                sklearn.cluster.KMeans(n_cluster=8,init='k-means++')

                                k-means'聚类'
                                n_cluster:开始的聚类中心数量
                                init:初始化方法,默认为'k-means++'

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

                                k-means对instacart Market用户聚类
                                1、降维之后的数据
                                2、k-means聚类
                                3、聚类结果显示

 

                

    


转载:https://blog.csdn.net/evanwusibin/article/details/106255177
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场