乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一文帶你讀懂線性分類器

       LibraryPKU 2019-02-06

      作者 | Thomas Pernet

      翻譯 | 鄧普斯·杰弗、涂世文、Disillusion


        什么是線性分類器?

      在有監(jiān)督學(xué)習(xí)中,最主要的兩種學(xué)習(xí)任務(wù)是 回歸(regression) 和 分類(classification),而其中 線性回歸 和 線性分類 最為常見。線性回歸是預(yù)測某一個具體的值,而線性分類是數(shù)據(jù)所屬類別進行預(yù)測。這里,我們主要關(guān)注線性分類問題。

      一般來說,幾乎 80% 機器學(xué)習(xí)任務(wù)可以看作是某種分類問題。分類,即給定一個輸入的集合,分類器致力于預(yù)測每一個類別的概率。類別標(biāo)記(也被稱為 應(yīng)變量或依賴變量)是一個離散的值,表示某個類別。

      1. 如果數(shù)據(jù)中的 Label 只有兩個類別,那么就屬于二分類問題,相應(yīng)的分類器被稱為 二分類器。

      2. 多分類器解決 Label 種類多于兩種類別的分類問題。

      譬如,預(yù)測顧客是否會進行二次購買便是一個典型的二分類問題。而識別圖片中出現(xiàn)動物則是屬于多分類問題,因為實際情況中動物有很多種。

      本文的理論部分主要關(guān)注于二分類問題。未來我們也會推出關(guān)于多分類的內(nèi)容,敬請期待!


        二分類器是如何工作的?

      在前面的教程中你已經(jīng)了解到函數(shù)由兩類變量組成,一個應(yīng)變量和一組特征(自變量)。在線性回歸中,應(yīng)變量是一個沒有范圍的實數(shù)。主要目標(biāo)是通過最小化均方誤差來預(yù)測其值。

      對于二分類任務(wù),標(biāo)簽可以有兩個可能的整數(shù)值。在大多數(shù)情況下,要么是[0,1]要么是[1,2]。

      例如,如果目標(biāo)是預(yù)測客戶是否會購買產(chǎn)品。標(biāo)簽可為如下:

      • Y = 1(客戶購買了產(chǎn)品)

      • Y = 0 (客戶沒有購買產(chǎn)品)

      該模型使用特征X將每個客戶分類到他最有可能的所屬類別,即是潛在購買者,或否。

      成功的概率用邏輯回歸計算。該算法將根據(jù)特征X計算出一個概率,并在該概率大于50%時預(yù)測成功。概率的算式如下:


      θ是權(quán)重的集合,x是特征,b是偏差 

      該函數(shù)可進一步分為兩部分:  

      • 線性模型  

      • 邏輯函數(shù)


      線性模型

      你已經(jīng)熟悉了計算權(quán)重的方法。權(quán)重計算使用點積:θ^ Tx + b

      Y是所有特征x_i的線性函數(shù)。如果模型沒有特征,則預(yù)測結(jié)果為偏差b。  

      權(quán)值表示特征x_i與標(biāo)簽y之間相關(guān)性的方向。正相關(guān)增加了正類的概率,而負相關(guān)使概率更接近于0(即負類)。

      線性模型只返回實數(shù),與區(qū)間[0,1]的概率測度不一致。因此需要邏輯函數(shù)將線性模型輸出轉(zhuǎn)換為概率。


      邏輯函數(shù)

      邏輯函數(shù),亦稱sigmoid函數(shù),為s形,且輸出總是在0和1之間。  

      將線性回歸的輸出代入sigmoid函數(shù)是很容易的。它產(chǎn)生一個概率在0和1之間的新數(shù)字。

      分類器可以將概率轉(zhuǎn)化為類

      • 0到0.49之間的值分到0類

      • 從0.5到1之間的值分到1類


        如何度量顯性分類器的性能?

      準(zhǔn)確度:

      分類器的整體性能是用準(zhǔn)確度量來衡量的。準(zhǔn)確度收集所有正確值除以觀測總數(shù)。例如,精度值為80%意味著模型在80%的情況下是正確的。

      您可以注意到這個度量的一個缺點,特別是對于不平衡樣本分類情況。當(dāng)每組的觀測次數(shù)不相等時,就會出現(xiàn)不平衡數(shù)據(jù)集。比如說,你試圖用logistics函數(shù)來分類一個罕見的事件。假設(shè)分類器試圖估計疾病后患者的死亡。在數(shù)據(jù)中,5%的病人去世了。您可以訓(xùn)練分類器來預(yù)測死亡人數(shù),并使用準(zhǔn)確度量來評估性能。如果分類器預(yù)測整個數(shù)據(jù)集的死亡為0,那么則95%的情況下是正確的。(也就是說,你的分類器可以直接判定都是不死亡,就可以實現(xiàn)非常高的準(zhǔn)確度)


      混淆矩陣:

      評估分類器性能的更好方法是查看混淆矩陣。

      想象的混亂矩陣的準(zhǔn)確度進行比較的當(dāng)前和預(yù)測的分類器分類。組成:二進制混淆矩陣法:

      1. TP: 真正:正確預(yù)測為實際正的預(yù)測值

      2. FP:預(yù)測值錯誤地預(yù)測了實際的正值。也就是說,預(yù)測為正值的負值

      3. FN:假負:預(yù)測為負的正值

      4. TN:真負:正確預(yù)測為實際負的預(yù)測值

      從混淆矩陣可以很容易地比較實際標(biāo)簽結(jié)果和預(yù)測標(biāo)簽結(jié)果。


      精確度和靈敏度

      混淆矩陣可以很好地洞察真陽性和假陽性。在某些情況下,是一個更簡潔的度量。

      精確度

      精準(zhǔn)度顯示正類的精度。它衡量了正類預(yù)測的正確程度。

      當(dāng)分類器對所有正值進行完全分類時,最大得分為1。精確度本身并不是很有幫助,因為它忽略了負類。度量通常與召回成對出現(xiàn)。回憶也被稱為敏感性或真陽性率。

      靈敏性
      靈敏度計算正確檢測到的正類的比率。這個指標(biāo)給出了模型識別正類的能力。


        tensorflow實現(xiàn)線性分類器

      對于本教程,我們將使用人口普查數(shù)據(jù)集。目的是使用人口普查數(shù)據(jù)集中的變量來預(yù)測收入水平。注意,收入是一個二元變量。

      1. 如果收入大于50K,值為1

      2. 如果收入小于50K,則為0。

      這個變量是你的類別標(biāo)簽

      該數(shù)據(jù)集包括八個分類變量:

      1. 工作場所

      2. 教育

      3. 婚姻的

      4. 職業(yè)

      5. 關(guān)系

      6. 種族

      7. 性別

      8. 國家

      此外,六個連續(xù)變量:

      1. 年齡

      2. FNLWgt

      3. 教育數(shù)字

      4. 資本收益

      5. 資本損失

      6. 小時\周

      通過這個例子,您將了解如何用張量流估計訓(xùn)練線性分類器,以及如何提高準(zhǔn)確度指標(biāo)。

      我們將按以下步驟進行:

      第一步:導(dǎo)入數(shù)據(jù)

      第二步:數(shù)據(jù)轉(zhuǎn)換

      第三步:訓(xùn)練分類器

      第四步:改進模型

      第5步:超參數(shù):Lasso & Ridge


      開始分布介紹:

      步驟1:導(dǎo)入數(shù)據(jù)

      首先導(dǎo)入教程中使用的庫。

      導(dǎo)入TensorFlow as tf \ import  pandas as pd

      接下來,從UCI存檔導(dǎo)入數(shù)據(jù)并定義列名稱。您將使用列來命名pandas dataframe。

      請注意,您將使用Pandas dataframe來訓(xùn)練分類器。

      import pandas as pd
      import tensorflow as tf
      ## Define path data
      COLUMNS = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital',
                'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss',
                'hours_week', 'native_country', 'label']
      PATH = 'https://archive.ics./ml/machine-learning-databases/adult/adult.data'
      PATH_test = 'https://archive.ics./ml/machine-learning-databases/adult/adult.test'

      /Users/Thomas/anaconda3/envs/hello-tf/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
       return f(*args, **kwds)

      在線存儲的數(shù)據(jù)已經(jīng)在訓(xùn)練組和測試組之間進行了劃分。

      df_train = pd.read_csv(PATH, skipinitialspace=True, names = COLUMNS, index_col=False)
      df_test = pd.read_csv(PATH_test,skiprows = 1, skipinitialspace=True, names = COLUMNS, index_col=False)

      訓(xùn)練數(shù)據(jù)集合包含32561組數(shù)據(jù),測試數(shù)據(jù)集中包含16281組數(shù)據(jù);

      print(df_train.shape, df_test.shape)
      print(df_train.dtypes)

      (32561, 15) (16281, 15)
      age                int64
      workclass         object
      fnlwgt             int64
      education         object
      education_num      int64
      marital           object
      occupation        object
      relationship      object
      race              object
      sex               object
      capital_gain       int64
      capital_loss       int64
      hours_week         int64
      native_country    object
      label             object
      dtype: object

      TensorFlow需要一個布爾值來訓(xùn)練分類器。您需要將值從字符串轉(zhuǎn)換為整數(shù)。標(biāo)簽存儲為一個對象,但是,您需要將其轉(zhuǎn)換為一個數(shù)值。下面的代碼創(chuàng)建一個字典,其中包含要轉(zhuǎn)換的值,并在列項上循環(huán)。請注意,您執(zhí)行此操作兩次,一次針對訓(xùn)練數(shù)據(jù)集,一次用于測試數(shù)據(jù)集;

      label = {'<=50K': 0,'>50K': 1}
      df_train.label = [label[item] for item in df_train.label]
      label_t = {'<=50K.': 0,'>50K.': 1}
      df_test.label = [label_t[item] for item in df_test.label]

      訓(xùn)練數(shù)據(jù)中,50K以下收入24720人,以上收入7841人。測試集的比率幾乎相同。有關(guān)更多信息,請參閱本教程中的方面。

      print(df_train['label'].value_counts())
      ### The model will be correct in atleast 70% of the case
      print(df_test['label'].value_counts())
      ## Unbalanced label
      print(df_train.dtypes)

      0    24720
      1     7841
      Name: label, dtype: int64
      0    12435
      1     3846
      Name: label, dtype: int64
      age                int64
      workclass         object
      fnlwgt             int64
      education         object
      education_num      int64
      marital           object
      occupation        object
      relationship      object
      race              object
      sex               object
      capital_gain       int64
      capital_loss       int64
      hours_week         int64
      native_country    object
      label              int64
      dtype: object


      第二步:數(shù)據(jù)轉(zhuǎn)化

      在用TensorFlow訓(xùn)練線性分類器之前,需要執(zhí)行幾個步驟。您需要準(zhǔn)備要包含在模型中的特征。在基準(zhǔn)回歸中,您將使用原始數(shù)據(jù)而不應(yīng)用任何轉(zhuǎn)換。

      估計器需要有一個特征列表來訓(xùn)練模型。因此,列的數(shù)據(jù)需要轉(zhuǎn)換為張量。

      一個好的實踐是根據(jù)特征的類型定義兩個特征列表,然后將它們傳遞到估計器的特征列中。

      您將從轉(zhuǎn)換連續(xù)特性開始,然后用分類數(shù)據(jù)定義一個bucket。

      數(shù)據(jù)集的特征有兩種格式:

      1. 整數(shù)

      2. 對象

      每個特征都根據(jù)其類型在接下來的兩個變量中列出。

      ## Add features to the bucket:
      ### Define continuous list
      CONTI_FEATURES  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']
      ### Define the categorical list
      CATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']

      Feature_column 裝配了一個對象numeric_column,以幫助將連續(xù)變量轉(zhuǎn)換為張量。在下面的代碼中,您可以將CONTI_FEATURES 特征中的所有變量轉(zhuǎn)換為具有數(shù)值的張量。這對于構(gòu)建模型是必需的。所有的自變量都需要轉(zhuǎn)換成合適的張量類型。

      下面我們編寫一個代碼,讓您了解feature_column.numeric_column 后面發(fā)生了什么。我們將打印轉(zhuǎn)換后的值用于解釋,因此不需要理解Python代碼。您可以參考官方文檔了解這些代碼。

      def print_transformation(feature = 'age', continuous = True, size = 2):
         #X = fc.numeric_column(feature)
         ## Create feature name
         feature_names = [
         feature]

      ## Create dict with the data
         d = dict(zip(feature_names, [df_train[feature]]))
         ## Convert age
         if continuous == True:
             c = tf.feature_column.numeric_column(feature)
             feature_columns = [c]
         else:
             c = tf.feature_column.categorical_column_with_hash_bucket(feature, hash_bucket_size=size)
             c_indicator = tf.feature_column.indicator_column(c)
             feature_columns = [c_indicator]
         
      ## Use input_layer to print the value
         input_layer = tf.feature_column.input_layer(
             features=d,
             feature_columns=feature_columns
             )
         ## Create lookup table
         zero = tf.constant(0, dtype=tf.float32)
         where = tf.not_equal(input_layer, zero)
         ## Return lookup tble
         indices = tf.where(where)
         values = tf.gather_nd(input_layer, indices)
         ## Initiate graph
         sess = tf.Session()
         ## Print value
         print(sess.run(input_layer))

      print_transformation(feature = 'age', continuous = True)

      [[39.]
      [50.]
      [38.]
      ...
      [58.]
      [22.]
      [52.]]

      這些值與df_train中的值完全相同

      continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]

      根據(jù)TensorFlow文檔,有不同的方法來轉(zhuǎn)換分類數(shù)據(jù)。如果某個功能的詞匯表是已知的,并且沒有足夠的值,則可以使用“詞匯表”創(chuàng)建“分類”列用categorical_column_with_vocabulary_list。它將為所有唯一詞匯表分配一個ID。

      例如,如果變量狀態(tài)有三個不同的值:

      1. 丈夫

      2. 妻子

      3. 單身

      然后三個ID將被屬性化。例如,丈夫?qū)碛蠭D 1,妻子ID 2等等。

      為了便于說明,可以使用此代碼在TensorFlow中將對象變量轉(zhuǎn)換為分類列。

      特征性別只能有兩個價值:男性或女性。當(dāng)我們轉(zhuǎn)換特征性時,TensorFlow將創(chuàng)建兩個新列,一個用于男性,一個用于女性。如果性別等于男性,那么新的列“男性”將等于1,而“女性”將等于0。此示例顯示在下表中:

      tensorflow中:

      print_transformation(feature = “sex”, continuous = False, size = 2)

      relationship = tf.feature_column.categorical_column_with_vocabulary_list(
         'relationship', [
             'Husband', 'Not-in-family', 'Wife', 'Own-child', 'Unmarried',
             'Other-relative'])

      下面,我們添加了python代碼來打印編碼。同樣,您不需要理解代碼,目的是看到轉(zhuǎn)換

      但是,轉(zhuǎn)換數(shù)據(jù)的一種更快的方法是使用方法:categorical_column_with_hash_bucket。改變稀疏矩陣中的字符串變量是有用的。稀疏矩陣是一個基本上為零的矩陣。您只需要指定存儲桶的數(shù)量和鍵列。桶數(shù)是TensorFlow可以創(chuàng)建的最大組數(shù)。鍵列只是要轉(zhuǎn)換的列的名稱。

      在下面的代碼中,您將在所有分類功能上創(chuàng)建一個循環(huán)。

      categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]


      第三步:訓(xùn)練分類器

      tensorflow目前為線性回歸和線性分類提供了一個estimator。

      1. 線性回歸:LinearRegressor

      2. 線性分類:LinearClassifier

      線性分類器的語法與線性回歸教程中的語法相同,除了一個參數(shù)n_class。您需要定義特征列、模型目錄,并與線性回歸器進行比較;您已經(jīng)定義了類的數(shù)量。對于邏輯回歸,類的數(shù)目等于2。

      模型將計算包含在continuous_features and categorical_features 的特征列的權(quán)重。

      model = tf.estimator.LinearClassifier(
         n_classes = 2,
         model_dir='ongoing/train',
         feature_columns=categorical_features+ continuous_features)
      INFO:tensorflow:Using default config.
      INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train', '_tf_random_seed': Non

      既然定義了分類器,就可以創(chuàng)建輸入函數(shù)。該方法與線性回歸器教程中的方法相同。在這里,您使用128的批量大小,然后對數(shù)據(jù)進行無序處理。

      FEATURES = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country']
      LABEL= 'label'
      def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
         return tf.estimator.inputs.pandas_input_fn(
            x=pd.DataFrame({k: data_set[k].values for k in FEATURES}),
            y = pd.Series(data_set[LABEL].values),
            batch_size=n_batch,  
            num_epochs=num_epochs,
            shuffle=shuffle)

      您可以使用線性估計所需的參數(shù)創(chuàng)建一個函數(shù),即epoch數(shù)、batches數(shù)和shuffle處理數(shù)據(jù)集或注釋。由于使用pandas方法將數(shù)據(jù)傳遞到模型中,因此需要將x變量定義為pandas dataframe。請注意,您將循環(huán)訪問存儲在FEATURES中的所有數(shù)據(jù)。

      讓我們用對象model.train來訓(xùn)練模型。您可以使用先前定義的函數(shù)向模型提供適當(dāng)?shù)闹?。請注意,您將批大小設(shè)置為128,并且將epoch數(shù)設(shè)置為none。模型將經(jīng)過一千多步的訓(xùn)練。

      model.train(input_fn=get_input_fn(df_train,
                                           num_epochs=None,
                                           n_batch = 128,
                                           shuffle=False),
                                           steps=1000)
      INFO:tensorflow:Calling model_fn.
      INFO:tensorflow:Done calling model_fn.
      INFO:tensorflow:Create CheckpointSaverHook.
      INFO:tensorflow:Graph was finalized.
      INFO:tensorflow:Running local_init_op.
      INFO:tensorflow:Done running local_init_op.
      INFO:tensorflow:Saving checkpoints for 0 into ongoing/train/model.ckpt.
      INFO:tensorflow:loss = 88.722855, step = 1
      INFO:tensorflow:global_step/sec: 95.9134
      INFO:tensorflow:loss = 52583.64, step = 101 (1.044 sec)
      INFO:tensorflow:global_step/sec: 167.726
      INFO:tensorflow:loss = 25203.816, step = 201 (0.596 sec)
      INFO:tensorflow:global_step/sec: 162.827
      INFO:tensorflow:loss = 54924.312, step = 301 (0.614 sec)
      INFO:tensorflow:global_step/sec: 226.156
      INFO:tensorflow:loss = 68509.31, step = 401 (0.443 sec)
      INFO:tensorflow:global_step/sec: 143.237
      INFO:tensorflow:loss = 9151.754, step = 501 (0.701 sec)
      INFO:tensorflow:global_step/sec: 140.458
      INFO:tensorflow:loss = 34576.06, step = 601 (0.710 sec)
      INFO:tensorflow:global_step/sec: 131.307
      INFO:tensorflow:loss = 36047.117, step = 701 (0.764 sec)
      INFO:tensorflow:global_step/sec: 150.417
      INFO:tensorflow:loss = 22608.148, step = 801 (0.665 sec)
      INFO:tensorflow:global_step/sec: 162.276
      INFO:tensorflow:loss = 22201.918, step = 901 (0.615 sec)
      INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train/model.ckpt.
      INFO:tensorflow:Loss for final step: 5444.363.

      <tensorflow.python.estimator.canned.linear.LinearClassifier at 0xb202e4668>

      請注意,損失隨后在最后100個步驟中減少,即從901減少到1000。

      一千次迭代后的最終損失是5444。您可以在測試集中估計您的模型并查看性能。要評估模型的性能,需要使用對象evaluate。您向模型提供測試集,并將epoch的數(shù)目設(shè)置為1,即數(shù)據(jù)將只輸入模型一次。

      model.evaluate(input_fn=get_input_fn(df_test,
                                           num_epochs=1,
                                           n_batch = 128,
                                           shuffle=False),
                                           steps=1000)
      INFO:tensorflow:Calling model_fn.
      WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to 'careful_interpolation' instead.
      WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to 'careful_interpolation' instead.
      INFO:tensorflow:Done calling model_fn.
      INFO:tensorflow:Starting evaluation at 2018-08-29-19:10:30
      INFO:tensorflow:Graph was finalized.
      INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000
      INFO:tensorflow:Running local_init_op.
      INFO:tensorflow:Done running local_init_op.
      INFO:tensorflow:Evaluation [100/1000]
      INFO:tensorflow:Finished evaluation at 2018-08-29-19:10:33
      INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7615626, accuracy_baseline = 0.76377374, auc = 0.63300294, auc_precision_recall = 0.50891197, average_loss = 47.12155, global_step = 1000, label/mean = 0.23622628, loss = 5993.6406, precision = 0.49401596, prediction/mean = 0.18454961, recall = 0.38637546
      INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: on

      {'accuracy': 0.7615626,
      'accuracy_baseline': 0.76377374,
      'auc': 0.63300294,
      'auc_precision_recall': 0.50891197,
      'average_loss': 47.12155,
      'label/mean': 0.23622628,
      'loss': 5993.6406,
      'precision': 0.49401596,
      'prediction/mean': 0.18454961,
      'recall': 0.38637546,
      'global_step': 1000}

      TensorFlow返回理論部分中學(xué)習(xí)的所有度量指標(biāo)。不出所料,由于標(biāo)簽不平衡,精度很高。實際上,模型的性能比隨機猜測略好。假設(shè)該模型預(yù)測所有收入低于50K的家庭,那么該模型的準(zhǔn)確率為70%。仔細分析,你會發(fā)現(xiàn)預(yù)測和召回都很低。


      第四部:模型改進

      既然你有了一個基準(zhǔn)模型,你可以嘗試改進它,也就是說,提高精確度。在前面的教程中,您學(xué)習(xí)了如何通過交互項提高預(yù)測能力。在本教程中,您將通過向回歸添加一個多項式項。

      當(dāng)數(shù)據(jù)存在非線性時,多項式回歸是有用的。有兩種方法可以捕獲數(shù)據(jù)中的非線性。

      1. 增加多項式項

      2. 將連續(xù)變量變?yōu)殡x散變量

      多項式項

      從下圖中,您可以看到什么是多項式回歸。它是一個具有不同冪次的x變量的方程。二次多項式回歸有兩個變量,x和x的平方。三度有三個變量,x、$x^ 2、\和\x^ 3$

      下面,我們構(gòu)造了一個有兩個變量的圖,x和y。很明顯,這種關(guān)系不是線性的。如果我們添加線性回歸,我們可以看到模型無法捕獲模式(左圖)。
      現(xiàn)在,從下面的圖片看左邊的圖片,我們在回歸中添加了五項。

      這個模型現(xiàn)在可以更好地捕捉模式。這是多項式回歸的強大。

      讓我們回到我們的例子。年齡與收入沒有線性關(guān)系。由于兒童或年輕人不工作,早年的收入可能接近零。然后它在工作年齡上增加,在退休期間減少。它通常是一個倒U形。捕獲這種模式的一種方法是在回歸中添加一個二次項。

      讓我們看看它是否提高了精確度。
      您需要將這個新特性添加到數(shù)據(jù)集和連續(xù)特性列表中。

      在訓(xùn)練和測試數(shù)據(jù)集中添加新的變量,這樣編寫函數(shù)就更方便了。

      def square_var(df_t, df_te, var_name = 'age'):
         df_t['new'] = df_t[var_name].pow(2)
         df_te['new'] = df_te[var_name].pow(2)
         return df_t, df_te

      函數(shù)有3個參數(shù):

      • 定義訓(xùn)練集

      • 定義測試集

      • var_name='age':定義要轉(zhuǎn)換的變量

      您可以使用對象POW(2)來調(diào)整可變年齡。請注意,新變量名為“new”

      現(xiàn)在編寫了函數(shù)square_var,就可以創(chuàng)建新的數(shù)據(jù)集。

      df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')

      如下所示,數(shù)據(jù)集多了一個新的特征:

      print(df_train_new.shape, df_test_new.shape)

      (32561, 16) (16281, 16)

      平方變量在數(shù)據(jù)集中稱為new。您需要將其添加到連續(xù)功能列表中。

      CONTI_FEATURES_NEW  = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week', 'new']
      continuous_features_new = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES_NEW]

      請注意,更改了圖形的目錄。不能在同一目錄中訓(xùn)練不同的模型。這意味著,你需要改變參數(shù) model_dir。如果不這樣做,TensorFlow將拋出一個錯誤。

      model_1 = tf.estimator.LinearClassifier(
         model_dir='ongoing/train1',
         feature_columns=categorical_features+ continuous_features_new)
      INFO:tensorflow:Using default config.
      INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train1', '_tf_random_seed': No

      FEATURES_NEW = ['age','workclass', 'fnlwgt', 'education', 'education_num', 'marital', 'occupation', 'relationship', 'race', 'sex', 'capital_gain', 'capital_loss', 'hours_week', 'native_country', 'new']
      def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
         return tf.estimator.inputs.pandas_input_fn(
            x=pd.DataFrame({k: data_set[k].values for k in FEATURES_NEW}),
            y = pd.Series(data_set[LABEL].values),
            batch_size=n_batch,  
            num_epochs=num_epochs,
            shuffle=shuffle)

      現(xiàn)在分類器是用新的數(shù)據(jù)集設(shè)計的,那么就可以訓(xùn)練和評估模型了。

      model_1.train(input_fn=get_input_fn(df_train,
                                           num_epochs=None,
                                           n_batch = 128,
                                           shuffle=False),
                                           steps=1000)
      INFO:tensorflow:Calling model_fn.
      INFO:tensorflow:Done calling model_fn.
      INFO:tensorflow:Create CheckpointSaverHook.
      INFO:tensorflow:Graph was finalized.
      INFO:tensorflow:Running local_init_op.
      INFO:tensorflow:Done running local_init_op.
      INFO:tensorflow:Saving checkpoints for 0 into ongoing/train1/model.ckpt.
      INFO:tensorflow:loss = 88.722855, step = 1
      INFO:tensorflow:global_step/sec: 65.4699
      INFO:tensorflow:loss = 70077.66, step = 101 (1.533 sec)
      INFO:tensorflow:global_step/sec: 166.451
      INFO:tensorflow:loss = 49522.082, step = 201 (0.599 sec)
      INFO:tensorflow:global_step/sec: 172.15
      INFO:tensorflow:loss = 107120.57, step = 301 (0.577 sec)
      INFO:tensorflow:global_step/sec: 135.673
      INFO:tensorflow:loss = 12814.152, step = 401 (0.741 sec)
      INFO:tensorflow:global_step/sec: 147.318
      INFO:tensorflow:loss = 19573.898, step = 501 (0.675 sec)
      INFO:tensorflow:global_step/sec: 205.764
      INFO:tensorflow:loss = 26381.986, step = 601 (0.486 sec)
      INFO:tensorflow:global_step/sec: 188.238
      INFO:tensorflow:loss = 23417.719, step = 701 (0.531 sec)
      INFO:tensorflow:global_step/sec: 226.805
      INFO:tensorflow:loss = 23946.049, step = 801 (0.441 sec)
      INFO:tensorflow:global_step/sec: 183.742
      INFO:tensorflow:loss = 3309.5786, step = 901 (0.544 sec)
      INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train1/model.ckpt.
      INFO:tensorflow:Loss for final step: 28861.898.

      <tensorflow.python.estimator.canned.linear.LinearClassifier at 0xb20308ba8>

      model_1.evaluate(input_fn=get_input_fn(df_test_new,
                                           num_epochs=1,
                                           n_batch = 128,
                                           shuffle=False),
                                           steps=1000)
      INFO:tensorflow:Calling model_fn.
      WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to 'careful_interpolation' instead.
      WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to 'careful_interpolation' instead.
      INFO:tensorflow:Done calling model_fn.
      INFO:tensorflow:Starting evaluation at 2018-08-29-19:10:49
      INFO:tensorflow:Graph was finalized.
      INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000
      INFO:tensorflow:Running local_init_op.
      INFO:tensorflow:Done running local_init_op.
      INFO:tensorflow:Evaluation [100/1000]
      INFO:tensorflow:Finished evaluation at 2018-08-29-19:10:51
      INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.7944229, accuracy_baseline = 0.76377374, auc = 0.6093755, auc_precision_recall = 0.54885805, average_loss = 111.0046, global_step = 1000, label/mean = 0.23622628, loss = 14119.265, precision = 0.6682401, prediction/mean = 0.09116262, recall = 0.2576703
      INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000:

      {'accuracy': 0.7944229,
      'accuracy_baseline': 0.76377374,
      'auc': 0.6093755,
      'auc_precision_recall': 0.54885805,
      'average_loss': 111.0046,
      'label/mean': 0.23622628,
      'loss': 14119.265,
      'precision': 0.6682401,
      'prediction/mean': 0.09116262,
      'recall': 0.2576703,
      'global_step': 1000}

      平方變量將精度從0.76提高到0.79。讓我們看看是否可以通過將bucketization和interaction項組合在一起做得更好。


        Bucketization and interaction

      正如您之前看到的,線性分類器無法正確捕獲年齡收入模式。這是因為它為每個特性學(xué)習(xí)一個權(quán)重。為了使分類器更容易,您可以做的一件事是將特征存儲起來。Bucketing根據(jù)數(shù)字特征所處的范圍將其轉(zhuǎn)換為若干特定特征,這些新特征中的每一個都指示一個人的年齡是否在該范圍內(nèi)。
      利用這些新特性,線性模型可以通過學(xué)習(xí)每個桶的不同權(quán)重來捕獲關(guān)系。
      在TensorFlow中,它是用bucketized_column完成的。您需要在邊界中添加值的范圍。

      age = tf.feature_column.numeric_column('age')
      age_buckets = tf.feature_column.bucketized_column(
         age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

      你已經(jīng)知道年齡與收入是非線性的。另一種改進模型的方法是通過interaction。在TensorFlow這個詞中,它是特征交叉。特征交叉是創(chuàng)建現(xiàn)有特征組合的新特征的一種方法,這對于無法對特征之間的交互進行建模的線性分類器很有幫助。

      你可以用教育這樣的另一個特征來劃分年齡。也就是說,有些群體的收入可能很高,而其他群體的收入可能很低(例如博士生)。

      education_x_occupation = [tf.feature_column.crossed_column(
         ['education', 'occupation'], hash_bucket_size=1000)]
      age_buckets_x_education_x_occupation = [tf.feature_column.crossed_column(
         [age_buckets, 'education', 'occupation'], hash_bucket_size=1000)]

      要創(chuàng)建交叉特征列,請使用帶變量的crossed_column在括號中交叉。散列桶大小表示最大的交叉可能性。要在變量之間創(chuàng)建交互(至少有一個變量需要分類),可以使用tf.feature_column.crossed_column。要使用此對象,需要在方括號中添加要交叉的變量和第二個參數(shù)bucket size。bucket size是變量中可能的最大組數(shù)。這里你把它設(shè)為1000,因為你不知道年齡組的確切數(shù)目。

      在將其添加到功能列之前需要平方。您還可以將新特性添加到特性列,并準(zhǔn)備estimator。

      base_columns = [
         age_buckets,
      ]
      model_imp = tf.estimator.LinearClassifier(
         model_dir='ongoing/train3',
         feature_columns=categorical_features+base_columns+education_x_occupation+

      INFO:tensorflow:Using default config.
      INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train3', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0xb20ef8550>, '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

      FEATURES_imp = ['age','workclass', 'education', 'education_num', 'marital',
                     'occupation', 'relationship', 'race', 'sex', 'native_country', 'new']

      def get_input_fn(data_set, num_epochs=None, n_batch = 128, shuffle=True):
         return tf.estimator.inputs.pandas_input_fn(
            x=pd.DataFrame({k: data_set[k].values for k in FEATURES_imp}),
            y = pd.Series(data_set[LABEL].values),
            batch_size=n_batch,  
            num_epochs=num_epochs,
            shuffle=shuffle)

      您已經(jīng)準(zhǔn)備好評估新模型,看看它是否提高了精度。

      model_imp.train(input_fn=get_input_fn(df_train_new,
                                           num_epochs=None,
                                           n_batch = 128,
                                           shuffle=False),
                                           steps=1000)
      INFO:tensorflow:Calling model_fn.
      INFO:tensorflow:Done calling model_fn.
      INFO:tensorflow:Create CheckpointSaverHook.
      INFO:tensorflow:Graph was finalized.
      INFO:tensorflow:Running local_init_op.
      INFO:tensorflow:Done running local_init_op.
      INFO:tensorflow:Saving checkpoints for 0 into ongoing/train3/model.ckpt.
      INFO:tensorflow:loss = 88.722855, step = 1
      INFO:tensorflow:global_step/sec: 110.894
      INFO:tensorflow:loss = 50.334488, step = 101 (0.905 sec)
      INFO:tensorflow:global_step/sec: 204.578
      INFO:tensorflow:loss = 56.153225, step = 201 (0.489 sec)
      INFO:tensorflow:global_step/sec: 201.008
      INFO:tensorflow:loss = 45.792007, step = 301 (0.495 sec)
      INFO:tensorflow:global_step/sec: 145.813
      INFO:tensorflow:loss = 37.485672, step = 401 (0.688 sec)
      INFO:tensorflow:global_step/sec: 255.157
      INFO:tensorflow:loss = 56.48449, step = 501 (0.390 sec)
      INFO:tensorflow:global_step/sec: 196.914
      INFO:tensorflow:loss = 32.528934, step = 601 (0.507 sec)
      INFO:tensorflow:global_step/sec: 190.965
      INFO:tensorflow:loss = 37.438057, step = 701 (0.529 sec)
      INFO:tensorflow:global_step/sec: 162.964
      INFO:tensorflow:loss = 61.1075, step = 801 (0.610 sec)
      INFO:tensorflow:global_step/sec: 202.747
      INFO:tensorflow:loss = 44.69645, step = 901 (0.494 sec)
      INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train3/model.ckpt.
      INFO:tensorflow:Loss for final step: 44.18133.

      <tensorflow.python.estimator.canned.linear.LinearClassifier at 0xb21883e80>

      model_imp.evaluate(input_fn=get_input_fn(df_test_new,
                                           num_epochs=1,
                                           n_batch = 128,
                                           shuffle=False),
                                           steps=1000)
      INFO:tensorflow:Calling model_fn.
      WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to 'careful_interpolation' instead.
      WARNING:tensorflow:Trapezoidal rule is known to produce incorrect PR-AUCs; please switch to 'careful_interpolation' instead.
      INFO:tensorflow:Done calling model_fn.
      INFO:tensorflow:Starting evaluation at 2018-08-29-19:11:05
      INFO:tensorflow:Graph was finalized.
      INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000
      INFO:tensorflow:Running local_init_op.
      INFO:tensorflow:Done running local_init_op.
      INFO:tensorflow:Evaluation [100/1000]
      INFO:tensorflow:Finished evaluation at 2018-08-29-19:11:06
      INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.8358209, accuracy_baseline = 0.76377374, auc = 0.88401634, auc_precision_recall = 0.69599575, average_loss = 0.35122654, global_step = 1000, label/mean = 0.23622628, loss = 44.67437, precision = 0.68986726, prediction/mean = 0.23320661, recall = 0.55408216
      INFO:tensorflow:Saving 'checkpoint_path' summary for global step 1000: ongoing/trai

      {'accuracy': 0.8358209,
      'accuracy_baseline': 0.76377374,
      'auc': 0.88401634,
      'auc_precision_recall': 0.69599575,
      'average_loss': 0.35122654,
      'label/mean': 0.23622628,
      'loss': 44.67437,
      'precision': 0.68986726,
      'prediction/mean': 0.23320661,
      'recall': 0.55408216,
      'global_step': 1000}

      新的準(zhǔn)確度是83.58%。它比以前的模型高4%。
      最后,您可以添加一個正則化項來防止過度擬合。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多