1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        在機器學(xué)習(xí)中處理大量數(shù)據(jù)!

        共 12614字,需瀏覽 26分鐘

         ·

        2021-04-08 22:08


        知乎 | https://zhuanlan.zhihu.com/p/357361005

        之前系統(tǒng)梳理過大數(shù)據(jù)概念和基礎(chǔ)知識(可點擊),本文基于PySpark在機器學(xué)習(xí)實踐中的用法,希望對大數(shù)據(jù)學(xué)習(xí)的同學(xué)起到拋磚引玉的作用。(當(dāng)數(shù)據(jù)集較小時,用Pandas足夠,當(dāng)數(shù)據(jù)量較大時,就需要利用分布式數(shù)據(jù)處理工具,Spark很適用)

        1.PySpark簡介

        Apache Spark是一個閃電般快速的實時處理框架。它進行內(nèi)存計算以實時分析數(shù)據(jù)。由于Apache Hadoop MapReduce僅執(zhí)行批處理并且缺乏實時處理功能,因此它開始出現(xiàn)。因此,引入了Apache Spark,因為它可以實時執(zhí)行流處理,也可以處理批處理。

        Apache Spark是Scala語言實現(xiàn)的一個計算框架。為了支持Python語言使用Spark,Apache Spark社區(qū)開發(fā)了一個工具PySpark。我們可以通過Python語言操作RDDs

        RDD簡介

        RDD (Resiliennt Distributed Datasets)

        ?RDD = 彈性 + 分布式 Datasets

        1)分布式,好處是讓數(shù)據(jù)在不同工作節(jié)點并行存儲,并行計算

        2)彈性,指的節(jié)點存儲時,既可以使用內(nèi)存,也可以使用外存

        ?RDD還有個特性是延遲計算,也就是一個完整的RDD運行任務(wù)分成兩部分:Transformation和Action

        Spark RDD的特性:

        • 分布式:可以分布在多臺機器上進行并行處理
        • 彈性:計算過程中內(nèi)存不夠時,它會和磁盤進行數(shù)據(jù)交換
        • 基于內(nèi)存:可以全部或部分緩存在內(nèi)存中
        • 只讀:不能修改,只能通過轉(zhuǎn)換操作生成新的 RDD

        2.Pandas和PySpark對比

        可以參考這位作者的,詳細(xì)的介紹了pyspark與pandas之間的區(qū)別:
        https://link.zhihu.com/?target=https%3A//blog.csdn.net/suzyu12345/article/details/79673483

        3.PySpark實戰(zhàn)小練

        數(shù)據(jù)集:從1994年人口普查數(shù)據(jù)庫中提取。(后臺回復(fù)“210323”可獲?。?/span>

        TO DO:預(yù)測一個人新收入是否會超過5萬美金

        參數(shù)說明:

        創(chuàng)建SparkSession

        from pyspark.sql import SparkSession
        spark=SparkSession.builder.appName('adult').getOrCreate()

        讀取數(shù)據(jù)

        df = spark.read.csv('adult.csv', inferSchema = True, header=True#讀取csv文件
        df.show(3)  #用來顯示前3行

        注意:pyspark必須創(chuàng)建SparkSession才能像類似于pandas一樣操作數(shù)據(jù)集

        我們看看數(shù)據(jù)集:

        cols = df.columns #和pandas一樣看列名
        df.printSchema()

        root
        |-- age: integer (nullable = true)
        |-- workclass: string (nullable = true)
        |-- fnlwgt: integer (nullable = true)
        |-- education: string (nullable = true)
        |-- education-num: integer (nullable = true)
        |-- marital-status: string (nullable = true)
        |-- occupation: string (nullable = true)
        |-- relationship: string (nullable = true)
        |-- race: string (nullable = true)
        |-- sex: string (nullable = true)
        |-- capital-gain: integer (nullable = true)
        |-- capital-loss: integer (nullable = true)
        |-- hours-per-week: integer (nullable = true)
        |-- native-country: string (nullable = true)
        |-- income: string (nullable = true)

        #找到所有的string類型的變量
        #dtypes用來看數(shù)據(jù)變量類型
        cat_features = [item[0for item in df.dtypes if item[1]=='string']
        # 需要刪除 income列,否則標(biāo)簽泄露
        cat_features.remove('income')
        #找到所有數(shù)字變量
        num_features = [item[0for item in df.dtypes if item[1]!='string']

        對于類別變量我們需要進行編碼,在pyspark中提供了StringIndexer, OneHotEncoder, VectorAssembler特征編碼模式:

        from pyspark.ml import Pipeline
        from pyspark.ml.feature import StringIndexer, OneHotEncoder, VectorAssembler

        stages = []
        for col in cat_features:
            # 字符串轉(zhuǎn)成索引
            string_index = StringIndexer(inputCol = col, outputCol = col + 'Index')
            # 轉(zhuǎn)換為OneHot編碼
            encoder = OneHotEncoder(inputCols=[string_index.getOutputCol()], outputCols=[col + "_one_hot"])
            # 將每個字段的轉(zhuǎn)換方式 放到stages中
            stages += [string_index, encoder]

        # 將income轉(zhuǎn)換為索引
        label_string_index = StringIndexer(inputCol = 'income', outputCol = 'label')
        # 添加到stages中
        stages += [label_string_index]

        # 類別變量 + 數(shù)值變量
        assembler_cols = [c + "_one_hot" for c in cat_features] + num_features
        assembler = VectorAssembler(inputCols=assembler_cols, outputCol="features")
        stages += [assembler]

        # 使用pipeline完成數(shù)據(jù)處理
        pipeline = Pipeline(stages=stages)
        pipeline_model = pipeline.fit(df)
        df = pipeline_model.transform(df)
        selected_cols = ["label""features"] + cols
        df = df.select(selected_cols)

        因為pyspark顯示的數(shù)據(jù)比較像Mysql 那樣不方便觀看,因此我們轉(zhuǎn)成pandas:

        import pandas as pd
        pd.DataFrame(df.take(20), columns = df.columns)

        通過pandas發(fā)現(xiàn),好像還有較多字符串變量,難道特征編碼失敗了?

        原來是使用VectorAssembler直接將特征轉(zhuǎn)成了features這一列,pyspark做ML時 需要特征編碼好了并做成向量列,

        到這里,數(shù)據(jù)的特征工程就做好了。

        分割數(shù)據(jù)集 測試集

        train, test = df.randomSplit([0.70.3], seed=2021)
        print(train.count())
        print(test.count())

        22795
        9766

        可以看到,訓(xùn)練集和測試集安裝7:3的比例分割了,接下來就是構(gòu)建模型進行訓(xùn)練。

        邏輯回歸

        from pyspark.ml.classification import LogisticRegression
        # 創(chuàng)建模型
        lr = LogisticRegression(featuresCol = 'features', labelCol = 'label',maxIter=10)
        lr_model = lr.fit(train)

        可以看到ML的用法和sklearn非常的像,因此使用起來也是相當(dāng)?shù)姆奖恪?/p>

        #結(jié)果預(yù)測

        predictions = lr_model.transform(test)

        看看predictions的結(jié)構(gòu)

        predictions.printSchema()

        root
        |-- label: double (nullable = false)
        |-- features: vector (nullable = true)
        |-- age: integer (nullable = true)
        |-- workclass: string (nullable = true)
        |-- fnlwgt: integer (nullable = true)
        |-- education: string (nullable = true)
        |-- education-num: integer (nullable = true)
        |-- marital-status: string (nullable = true)
        |-- occupation: string (nullable = true)
        |-- relationship: string (nullable = true)
        |-- race: string (nullable = true)
        |-- sex: string (nullable = true)
        |-- capital-gain: integer (nullable = true)
        |-- capital-loss: integer (nullable = true)
        |-- hours-per-week: integer (nullable = true)
        |-- native-country: string (nullable = true)
        |-- income: string (nullable = true)
        |-- rawPrediction: vector (nullable = true)
        |-- probability: vector (nullable = true)
        |-- prediction: double (nullable = false)

        抽取需要的信息

        selected = predictions.select("label""prediction""probability""age""occupation")
        display(selected)
        selected.show(4)

        技術(shù)AUC值

        from pyspark.ml.evaluation import BinaryClassificationEvaluator
        # 模型評估,通過原始數(shù)據(jù) rawPrediction計算AUC
        evaluator = BinaryClassificationEvaluator(rawPredictionCol="rawPrediction")
        print('AUC:', evaluator.evaluate(predictions))

        AUC:0.9062153434371653

        進行網(wǎng)格調(diào)參

        from pyspark.ml.tuning import ParamGridBuilder, CrossValidator

        # 創(chuàng)建網(wǎng)絡(luò)參數(shù),用于交叉驗證
        param_grid = (ParamGridBuilder()
                     .addGrid(lr.regParam, [0.010.52.0])
                     .addGrid(lr.elasticNetParam, [0.00.51.0])
                     .addGrid(lr.maxIter, [1510])
                     .build())
        # 五折交叉驗證,設(shè)置模型,網(wǎng)格參數(shù),驗證方法,折數(shù)
        cv = CrossValidator(estimator=lr, estimatorParamMaps=param_grid, evaluator=evaluator, numFolds=5)
        # 交叉驗證運行
        cv_model = cv.fit(train)
        # 對于測試數(shù)據(jù),使用五折交叉驗證
        predictions = cv_model.transform(test)
        print('AUC:', evaluator.evaluate(predictions))

        AUC:0.9054096433333642

        決策樹模型

        from pyspark.ml.classification import DecisionTreeClassifier

        # 創(chuàng)建決策樹模型
        dt = DecisionTreeClassifier(featuresCol = 'features', labelCol = 'label', maxDepth = 3)
        dt_model = dt.fit(train)

        #查看決策樹結(jié)構(gòu)
        print(dt_model._call_java('toDebugString'))

        DecisionTreeClassificationModel: uid=DecisionTreeClassifier_4bd113e9a3c2, depth=3, numNodes=11, numClasses=2, numFeatures=100
        If (feature 23 in {0.0})
        If (feature 97 <= 7792.0)
        Predict: 0.0
        Else (feature 97 > 7792.0)
        If (feature 94 <= 19.5)
        Predict: 0.0
        Else (feature 94 > 19.5)
        Predict: 1.0
        Else (feature 23 not in {0.0})
        If (feature 96 <= 12.5)
        If (feature 97 <= 3368.0)
        Predict: 0.0
        Else (feature 97 > 3368.0)
        Predict: 1.0
        Else (feature 96 > 12.5)
        Predict: 1.0

        predictions = dt_model.transform(test)
        predictions.printSchema()

        root
        |-- label: double (nullable = false)
        |-- features: vector (nullable = true)
        |-- age: integer (nullable = true)
        |-- workclass: string (nullable = true)
        |-- fnlwgt: integer (nullable = true)
        |-- education: string (nullable = true)
        |-- education-num: integer (nullable = true)
        |-- marital-status: string (nullable = true)
        |-- occupation: string (nullable = true)
        |-- relationship: string (nullable = true)
        |-- race: string (nullable = true)
        |-- sex: string (nullable = true)
        |-- capital-gain: integer (nullable = true)
        |-- capital-loss: integer (nullable = true)
        |-- hours-per-week: integer (nullable = true)
        |-- native-country: string (nullable = true)
        |-- income: string (nullable = true)
        |-- rawPrediction: vector (nullable = true)
        |-- probability: vector (nullable = true)
        |-- prediction: double (nullable = false)

        #計算AUC值

        from pyspark.ml.evaluation import BinaryClassificationEvaluator

        evaluator = BinaryClassificationEvaluator()
        evaluator.evaluate(predictions)

        0.7455098804457034

        網(wǎng)格搜參數(shù)

        from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
        param_grid = (ParamGridBuilder()
                     .addGrid(dt.maxDepth, [12610])
                     .addGrid(dt.maxBins, [204080])
                     .build())
        # 設(shè)置五折交叉驗證
        cv = CrossValidator(estimator=dt, estimatorParamMaps=param_grid, evaluator=evaluator, numFolds=5)
        # 運行cv
        cv_model = cv.fit(train)
        # 查看最優(yōu)模型
        print("numNodes = ", cv_model.bestModel.numNodes)
        print("depth = ", cv_model.bestModel.depth)

        numNodes = 429
        depth = 10

        # 使用五折交叉驗證進行預(yù)測
        predictions = cv_model.transform(test)
        evaluator.evaluate(predictions)

        0.7850384321616918

        隨機森林

        from pyspark.ml.classification import RandomForestClassifier
        # 隨機森林
        rf = RandomForestClassifier(featuresCol = 'features', labelCol = 'label')
        rf_model = rf.fit(train)
        predictions = rf_model.transform(test)
        predictions.printSchema()
        selected = predictions.select("label""prediction""probability""age""occupation")
        display(selected)

        evaluator = BinaryClassificationEvaluator()
        evaluator.evaluate(predictions)

        0.8932162982538805

        一樣的方法

        param_grid = (ParamGridBuilder()
                     .addGrid(rf.maxDepth, [357])
                     .addGrid(rf.maxBins, [2050])
                     .addGrid(rf.numTrees, [510])
                     .build())
        cv = CrossValidator(estimator=rf, estimatorParamMaps=param_grid, evaluator=evaluator, numFolds=5)
        # 運行CV(大約6分鐘)
        cv_model = cv.fit(train)
        predictions = cv_model.transform(test)
        evaluator.evaluate(predictions)

        0.8948376797236669

        查看模型的結(jié)構(gòu)和特征重要性

        best_model

        RandomForestClassificationModel: uid=RandomForestClassifier_15bbbdd6642a, numTrees=10, numClasses=2, numFeatures=100

        best_model.featureImportances

        太長了省略

        df.schema['features'].metadata
        temp = df.schema["features"].metadata["ml_attr"]["attrs"]
        df_importance = pd.DataFrame(columns=['idx''name'])
        for attr in temp['numeric']:
            temp_df = {}
            temp_df['idx'] = attr['idx']
            temp_df['name'] = attr['name']
            #print(temp_df)
            df_importance = df_importance.append(temp_df, ignore_index=True)
            #print(attr['idx'], attr['name'])
            #print(attr)
            #break
        df_importance

        for attr in temp['binary']:
            temp_df = {}
            temp_df['idx'] = attr['idx']
            temp_df['name'] = attr['name']
            df_importance = df_importance.append(temp_df, ignore_index=True)
        df_importance

        對特征重要性進行可視化

        df_temp = pd.DataFrame(best_model.featureImportances.toArray())
        df_temp.columns = ['feature_importance']
        df_importance = df_importance.merge(df_temp, left_index=True, right_index=True)
        df_importance.sort_values(by=['feature_importance'], ascending=False, inplace=True)
        df_importance

        4.小結(jié)

        本節(jié)選用了一個常規(guī)的數(shù)據(jù)集,需要通過UCI提供的數(shù)據(jù)預(yù)測個人收入是否會大于5萬,本節(jié)用PySpark對數(shù)據(jù)進行了讀取,特征的編碼以及特征的構(gòu)建,并分別使用了邏輯回歸、決策樹以及隨機森林算法展示數(shù)據(jù)預(yù)測的過程。

        spark通過封裝成pyspark后使用難度降低了很多,而且pyspark的ML包提供了基本的機器學(xué)習(xí)模型,可以直接使用,模型的使用方法和sklearn比較相似,因此學(xué)習(xí)成本較低。

        “整理不易,三連
        瀏覽 30
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            中国免费视频高清观看| 猫咪AV大香蕉| 91涩| 亚洲天堂久久久| yy午夜福利| 黄片网站在线观看| 免费看操逼视频| 黄片高清免费| 91麻豆香蕉| 俺去俺来也www色官网黑人| 一区二区三区水蜜桃| 免费A片在线| 三级黄色小视频| 综合色国产精品欧美在线观看 | 精品无码免费视频| 天天综合网久久| 青娱乐偷窥成| 亚洲高清无码在线观看| 拍拍视频| 99热免费在线| 国产精品久久精品| 午夜成人视频在线观看| 人人操人人搞| 婷婷毛片| 丁香六月婷婷综合激情欧美| 亚洲综合二区| 欧美AAAAA| 尤物视频网站在线观看| 日本A片一级| 蜜桃黄片AV在线观看| 亚洲精品国产精品国自产在线| 成人肏逼视频在线| 国产91嫩草乱婬A片2蜜臀| 黄片视频观看| 亚洲AV偷拍| 日本91视频| 五月婷婷丁香| 北条麻妃一区二区三区在线| 日韩欧美片| 国产成人秘在线观看免费网站| 成人五区| 老妇槡BBBB槡BBBB槡| 亚洲视频免费完整版在线播放| 欧美9999| 黄色大片AV在线| 插入综合网| 丰满熟妇高潮呻吟无码| 少妇高潮喷水视频| 色综合色综合| 天堂VA蜜桃一区二区三区| 西西www444无码大胆| 国产精品秘国产精品88| 国产亚洲中文| 亚洲精品一区二区三区在线观看| ⅴA日本成人| 美女网站永久免费观看| 国产成人ab| 亚洲成人在线| 国产精品毛片VA一区二区三区| 77777精品成人免费A片| 好色婷婷| 亚洲激情视频| 国产尤物在线观看| 超碰在线人人| 国产精品网站在线观看| 国产无码一区二区| 成人一区二区三区四区五区| 777三级| 亚洲日韩激情| 国产精品视频| 国产精品免费人成网站酒店| 在线视频一区二区三区四区| 亚洲日韩在线观看视频| 婷婷色777777| 做a视频| 国产女人18毛片水18精| 日本黄色免费网站| 婷婷五月丁香在线| 七十路の高齢熟妇无码| 亚洲欧美精品AAAAAA片| 中国免费XXXX18| 玩弄小怮女在线观看| 欧美视频在线观看一区| 一道本视频| 色老板在线观看| 激情综合网五月婷婷| 欧美操b| 欧美色五月| 日本中文字幕网| 污网站免费在线观看| av天堂手机网| 草B视频| 国产精品不卡| 波多野结衣无码一区| 人妻人人澡| 精品一区二区三区蜜桃臀www| 久久久久久久免费无码| 五月婷婷基地| 欧美黄色网视频| 日韩不卡视频在线| 国产无遮挡又黄又爽又色学生软件| 亚洲成a人无码| 欧美成人精品在线| 99性爱视频| 免费尻屄视频| 91成人视频18| 中文字幕特黄A片| 六月婷婷中文字幕| 狠狠躁日日躁夜夜躁A片无码视频 强伦轩一区二区三区四区播放方式 | 中文字幕+乱码+中文乱码电影| 天天搞天天曰在线观看| 婷婷综合一区| 成人做爰A片AAA毛真人| 日本wwwwww| 操b视频在线观看| 欧美亚洲成人网站| 欧美A片在线播放| 日本熟女视频| 国产在线播放av| 最近中文字幕免费| 奥门毛片| 一级黄色视频在线观看| 巨爆乳肉感一区二区三区视频| 五月天一区二区| 欧美五月在线网址| 欧美精品成人免费| 黑人AV| 人人妻人人澡人人爽人人爽| 男人天堂网站| 国产精品视频在线免费观看 | 一级黄A片| 影音先锋av中文字幕| 69成人导航| 中文字幕15页| 九热大香蕉| 在线看91| 夜夜骑射| 午夜福利黄| 日韩无码高清网站| 国产一级操逼视频| 中文无码网站| 久久aa| 91av在线免费播放| 国产一区二区视频在线观看| 亚洲免费视频在线看| AA片免费网站| 麻豆秘在线观看国产| 天天操天天拍| 色色三区| 免费看成人747474九号视频在线观看 | 麻豆精品无码| 五月丁香啪啪啪| 国产精品91在线| 少妇激情网站| 2025国产成人精品一区| 免费AV资源在线观看| 日韩人妻视频| 久操免费在线观看| 大香蕉日韩| 学生妹内射| 久久91久久久久麻豆精品| 国产无码二区| 日本一区二区三区四区| 狠狠干2021| 曰韩一级片| 国产成人AV在线| 丁香五月中文| 久色无码| 日韩成人A片| 欧美MV日韩MV国产网站| 狠狠躁日日躁夜夜躁A片无码视频| 久草免费在线观看视频| 黑人vs亚洲人在线播放| 翔田千里无码在线| 日本成人免费| 欧美日韩中文字幕无码| 探花无码| 无码婬片A片AAA毛片艳谭| 尤物AV| 欧美色图888| 撸撸操在线视频观看只有精品| 特级毛片WWW| 东京热视频网址| 99热大香蕉| 欧美伊人大香蕉| 亚洲中文AV在线| 一级片免费| 亚洲欧美高清| 亚洲无码人妻在线| 成人免费视频在线观看| 羞羞视频com.入口| 国产一级二级三级久久久| 久操视频在线| 另类小说五月天| 国产精品无码激情| xxx久久| 久草免费在线| 国产精品秘久久久久久一两个一起| 蜜臀久久99精品久久一区二区| 人妻综合网| 亚洲一区欧美| 苍井空一区二区三区四区| 四虎精品一区二区三区| 先锋成人在线| 人妻HDHDHD96XXXX| 国产人妻一区二区三区欧美毛片| 日韩人妻丰满无码区A片| 国产免费内射| 日屄在线观看| 丁香五月在线视频| 亚洲特级毛片| 国产精品亚洲一区| 韩国毛片| 中文字幕在线观看高清| h片无码| 一本免费视频| 日本无码一区二区三三| 欧美丰满老熟妇XXXXX性| 日韩四区| 最好看2019中文在线播放电影| 视频在线观看一区| 怡红院成人在线| 西西掰穴| 五月天婷婷在线观看| av在线免费观看网站| 天天操婷婷| 国产一区亚洲| 亚洲高清无码免费| 色婷婷视频在线播放| 成人网站无码| 999福利视频| 国产精品乱草| 成人网站在线免费| 中文在线字幕高清电视剧| 国产白丝在线观看| 国产精品视频网站| 色猫咪av| 天堂成人av| 安徽少妇搡bbw搡bbbb| 天天天操| 日本不卡视频在线| 毛片久久久| 久久国产精品精品国产色婷婷| 秋霞网一区二区| 无码三级在线免费观看| 唐山熟女工棚嗷嗷叫| 尹人在线视频| 女人av天堂| 国产黄色电影在线| 中文字幕高清无码免费视频| 五月丁香六月婷| 超碰人人射| 精品成人免费视频| 日韩免费黄色视频| 国产理论在线| 精品少妇无码视频| 日韩大码无码| 国产又爽又黄免费视频免费观看| 亚洲无码福利| 黄色美女视频网站| 亚洲专区在线| 亚洲最大福利视频| 中文字幕在线一区二区a| 少妇久久久久久久久久| 国产1区在线观看| 亚洲欧美精品AAAAAA片| 国产美女精品久久AV爽| 91AV电影| 亚洲久久无码| 国产A片视频| 五月天社区| 你懂的网址在线观看| 九九九精品在线| 免费无码一级A片大黄在线观看| 免费在线观看无码| 色中色AV| 国产欧美另类| 久久久无码AV| 亚洲日韩成人AV| 黑人AV在线播放| 在线观看视频日韩| 色色网站免费| 麻豆av人人乐| 日韩一级黄片| 99久久精品国产毛片| 免费黄色| av高清无码| 国产黄色免费| 狠狠干狠狠干| 高清无码三级片| 国产高清一区| 欧美三P囗交做爰| 国产成人无码一区二区| 欧美a√| 亚洲V国产v欧美v久久久久久| 日韩无码AV一区二区| 久久免费视频1| 特大妓女BBwBBWBBw| 亚洲无码成人网| 国产一区二区成人久久919色|