Phân loại nhị phân TensorFlow: Ví dụ về phân loại tuyến tính

Hai phổ biến nhất học có giám sát nhiệm vụ là hồi quy tuyến tính và phân loại tuyến tính. Hồi quy tuyến tính dự đoán một giá trị trong khi bộ phân loại tuyến tính dự đoán một lớp. Hướng dẫn này tập trung vào Bộ phân loại tuyến tính.

Phân loại tuyến tính là gì?

A Phân loại tuyến tính trong Machine Learning là phương pháp tìm lớp của một đối tượng dựa trên các đặc điểm của nó để phân loại thống kê. Nó đưa ra quyết định phân loại dựa trên giá trị của sự kết hợp tuyến tính các đặc tính của một đối tượng. Trình phân loại tuyến tính được sử dụng trong các bài toán thực tế như phân loại tài liệu và các bài toán có nhiều biến.

Các vấn đề về phân loại chiếm khoảng 80% nhiệm vụ học máy. Phân loại nhằm mục đích dự đoán xác suất của mỗi lớp với một tập hợp đầu vào. Nhãn (tức là biến phụ thuộc) là một giá trị rời rạc, được gọi là lớp.

  1. Nếu nhãn chỉ có hai lớp thì thuật toán học là Phân loại nhị phân.
  2. Trình phân loại nhiều lớp xử lý các nhãn có nhiều hơn hai lớp.

Ví dụ, một bài toán phân loại nhị phân điển hình là dự đoán khả năng khách hàng sẽ mua hàng lần thứ hai. Dự đoán loại động vật hiển thị trên ảnh là một vấn đề phân loại nhiều lớp vì hiện có nhiều hơn hai giống động vật.

Phần lý thuyết của hướng dẫn này tập trung chủ yếu vào lớp nhị phân. Bạn sẽ tìm hiểu thêm về hàm đầu ra nhiều lớp trong phần hướng dẫn sau.

Trình phân loại nhị phân hoạt động như thế nào?

Bạn đã học trong phần hướng dẫn trước rằng một hàm bao gồm hai loại biến, một biến phụ thuộc và một tập hợp các đặc điểm (biến độc lập). Trong hồi quy tuyến tính, biến phụ thuộc là số thực không có phạm vi. Mục tiêu chính là dự đoán giá trị của nó bằng cách giảm thiểu sai số bình phương trung bình.

Đối với Trình phân loại nhị phân TensorFlow, nhãn có thể có hai giá trị nguyên có thể có. Trong hầu hết các trường hợp, nó là [0,1] hoặc [1,2]. Chẳng hạn, mục tiêu là dự đoán liệu khách hàng có mua sản phẩm hay không. Nhãn được xác định như sau:

  • Y = 1 (khách hàng mua sản phẩm)
  • Y = 0 (khách hàng không mua sản phẩm)

Mô hình sử dụng các đặc điểm X để phân loại từng khách hàng theo loại có khả năng cao nhất mà họ thuộc về, cụ thể là người mua tiềm năng hay không.

Xác suất thành công được tính bằng hồi quy logistic. Thuật toán sẽ tính toán xác suất dựa trên tính năng X và dự đoán thành công khi xác suất này trên 50%. Chính thức hơn, xác suất được tính như trong ví dụ Phân loại nhị phân TensorFlow bên dưới:

Ví dụ phân loại nhị phân

trong đó 0 là tập các trọng số, các đặc điểm và b độ lệch.

Hàm này có thể được phân tách thành hai phần:

  • Mô hình tuyến tính
  • Chức năng hậu cần

Mô hình tuyến tính

Bạn đã quen với cách tính trọng số. Trọng lượng được tính bằng cách sử dụng tích số chấm:chấm sản phẩm Y là hàm tuyến tính của tất cả các tính năng xi. Nếu mô hình không có đặc điểm thì dự đoán bằng độ lệch b.

Các trọng số cho biết hướng tương quan giữa các đặc điểm xi và nhãn y. Mối tương quan dương làm tăng xác suất của lớp dương trong khi mối tương quan âm dẫn đến xác suất gần bằng 0, (tức là lớp âm).

Mô hình tuyến tính chỉ trả về số thực, không phù hợp với thước đo xác suất của phạm vi [0,1]. Hàm logistic được yêu cầu để chuyển đổi đầu ra của mô hình tuyến tính thành xác suất,

chức năng hậu cần

Hàm logistic hay hàm sigmoid có hình chữ S và đầu ra của hàm này luôn nằm trong khoảng từ 0 đến 1.

Ví dụ về hàm logistic

Ví dụ về hàm logistic
Ví dụ về hàm logistic

Có thể dễ dàng thay thế đầu ra của hồi quy tuyến tính bằng hàm sigmoid. Nó dẫn đến một số mới có xác suất từ ​​0 đến 1.

Bộ phân loại có thể chuyển đổi xác suất thành một lớp

  • Các giá trị từ 0 đến 0.49 trở thành lớp 0
  • Các giá trị từ 0.5 đến 1 trở thành lớp 1

Làm cách nào để đo hiệu suất của Trình phân loại tuyến tính?

tính chính xác

Hiệu suất tổng thể của bộ phân loại được đo bằng thước đo độ chính xác. Độ chính xác thu thập tất cả các giá trị chính xác chia cho tổng số quan sát. Ví dụ: giá trị độ chính xác là 80% có nghĩa là mô hình đúng trong 80% trường hợp.

Số liệu chính xác
Đo lường hiệu suất của Trình phân loại tuyến tính bằng chỉ số Độ chính xác

Bạn có thể lưu ý một thiếu sót với số liệu này, đặc biệt là đối với lớp mất cân bằng. Một tập dữ liệu mất cân bằng xảy ra khi số lượng quan sát trên mỗi nhóm không bằng nhau. Giả sử; bạn cố gắng phân loại một sự kiện hiếm gặp bằng một hàm logistic. Hãy tưởng tượng bộ phân loại cố gắng ước tính số ca tử vong của một bệnh nhân sau khi mắc bệnh. Trong dữ liệu, 5 phần trăm bệnh nhân tử vong. Bạn có thể đào tạo một bộ phân loại để dự đoán số ca tử vong và sử dụng số liệu độ chính xác để đánh giá hiệu suất. Nếu bộ phân loại dự đoán 0 ca tử vong cho toàn bộ tập dữ liệu, thì nó sẽ đúng trong 95 phần trăm trường hợp.

Ma trận hỗn loạn

Cách tốt hơn để đánh giá hiệu suất của bộ phân loại là xem xét ma trận nhầm lẫn.

Ma trận hỗn loạn
Đo hiệu suất của Trình phân loại tuyến tính bằng ma trận nhầm lẫn

ma trận hỗn loạn trực quan hóa độ chính xác của bộ phân loại bằng cách so sánh các lớp thực tế và dự đoán như được hiển thị trong ví dụ về Bộ phân loại tuyến tính ở trên. Ma trận nhầm lẫn nhị phân bao gồm các hình vuông:

  • TP: Giá trị thực dương: Giá trị được dự đoán được dự đoán chính xác là giá trị dương thực tế
  • FP: Các giá trị được dự đoán đã dự đoán không chính xác một giá trị dương thực tế. tức là, giá trị âm được dự đoán là dương
  • FN: Sai Âm: Giá trị dương được dự đoán là âm
  • TN: Đúng Âm: Các giá trị được dự đoán được dự đoán chính xác là giá trị âm thực tế

Từ ma trận nhầm lẫn, có thể dễ dàng so sánh lớp thực tế và lớp dự đoán.

Độ chính xác và độ nhạy

Ma trận nhầm lẫn cung cấp cái nhìn sâu sắc về dương tính thật và dương tính giả. Trong một số trường hợp, tốt hơn là nên có số liệu ngắn gọn hơn.

Độ chính xác

Số liệu chính xác cho thấy độ chính xác của lớp tích cực. Nó đo lường khả năng dự đoán của lớp tích cực là chính xác.

Độ chính xác

Điểm tối đa là 1 khi bộ phân loại phân loại hoàn hảo tất cả các giá trị dương. Chỉ riêng độ chính xác thì không hữu ích lắm vì nó bỏ qua lớp phủ định. Số liệu này thường được ghép nối với số liệu Thu hồi. Việc thu hồi còn được gọi là độ nhạy hoặc tỷ lệ dương tính thực sự.

Độ nhạy

Độ nhạy tính toán tỷ lệ các lớp dương tính được phát hiện chính xác. Số liệu này cho biết mô hình tốt như thế nào để nhận ra một lớp tích cực.

Độ nhạy

Trình phân loại tuyến tính với TensorFlow

Đối với hướng dẫn này, chúng tôi sẽ sử dụng tập dữ liệu điều tra dân số. Mục đích là sử dụng các biến trong tập dữ liệu điều tra dân số để dự đoán mức thu nhập. Lưu ý rằng thu nhập là một biến nhị phân

  • có giá trị là 1 nếu thu nhập > 50k
  • 0 nếu thu nhập < 50k.

Biến này là nhãn của bạn

Bộ dữ liệu này bao gồm tám biến phân loại:

  • nơi làm việc
  • giáo dục
  • hôn nhân
  • nghề nghiệp
  • mối quan hệ
  • cuộc đua
  • quan hệ tình dục
  • quê hương

hơn nữa, sáu biến liên tục:

  • tuổi
  • fnlwgt
  • giáo dục_num
  • tăng vốn
  • vốn_lỗ
  • giờ_tuần

Thông qua ví dụ về Phân loại TensorFlow này, bạn sẽ hiểu cách huấn luyện Bộ phân loại TensorFlow tuyến tính bằng công cụ ước tính TensorFlow và cách cải thiện chỉ số độ chính xác.

Chúng ta sẽ tiến hành như sau:

  • Bước 1) Nhập dữ liệu
  • Bước 2) Chuyển đổi dữ liệu
  • Bước 3) Huấn luyện bộ phân loại
  • Bước 4) Cải thiện mô hình
  • Bước 5) Siêu tham số: Lasso & Ridge

Bước 1) Nhập dữ liệu

Trước tiên, bạn nhập các thư viện được sử dụng trong phần hướng dẫn.

import tensorflow as tf
import pandas as pd

Tiếp theo, bạn nhập dữ liệu từ kho lưu trữ UCI và xác định tên các cột. Bạn sẽ sử dụng COLUMNS để đặt tên cho các cột trong khung dữ liệu pandas.

Lưu ý rằng bạn sẽ huấn luyện trình phân loại bằng khung dữ liệu Pandas.

## 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.uci.edu/ml/machine-learning-databases/adult/adult.data"
PATH_test = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.test"

Dữ liệu được lưu trữ trực tuyến đã được phân chia giữa tập huấn luyện và tập kiểm tra.

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)

Tập huấn luyện chứa 32,561 quan sát và tập kiểm tra 16,281

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 yêu cầu giá trị Boolean để huấn luyện bộ phân loại. Bạn cần truyền các giá trị từ chuỗi sang số nguyên. Nhãn được lưu trữ dưới dạng đối tượng, tuy nhiên, bạn cần chuyển đổi nó thành giá trị số. Đoạn mã bên dưới tạo một từ điển có các giá trị cần chuyển đổi và lặp qua mục cột. Lưu ý rằng bạn thực hiện thao tác này hai lần, một cho bài kiểm tra tàu, một cho bộ kiểm tra

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]

Trong dữ liệu tàu, có 24,720 thu nhập thấp hơn 50k và 7841 ở trên. Tỷ lệ gần như giống nhau đối với tập kiểm tra. Vui lòng tham khảo hướng dẫn này về Facet để biết thêm.

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

Bước 2) Chuyển đổi dữ liệu

Cần thực hiện một số bước trước khi huấn luyện bộ phân loại tuyến tính bằng Tensorflow. Bạn cần chuẩn bị các tính năng để đưa vào mô hình. Trong hồi quy điểm chuẩn, bạn sẽ sử dụng dữ liệu gốc mà không áp dụng bất kỳ phép biến đổi nào.

Công cụ ước tính cần có danh sách các tính năng để huấn luyện mô hình. Do đó, dữ liệu của cột cần phải được chuyển đổi thành tensor.

Một cách thực hành tốt là xác định hai danh sách đối tượng dựa trên loại của chúng và sau đó chuyển chúng vào feature_columns của công cụ ước tính.

Bạn sẽ bắt đầu bằng cách chuyển đổi các tính năng liên tục, sau đó xác định nhóm có dữ liệu phân loại.

Các tính năng của tập dữ liệu có hai định dạng:

  • Số nguyên
  • Đối tượng

Mỗi tính năng được liệt kê trong hai biến tiếp theo theo loại của chúng.

## 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 được trang bị một đối tượng number_column để giúp chuyển đổi các biến liên tục thành tensor. Trong mã bên dưới, bạn chuyển đổi tất cả các biến từ CONTI_FEATURES thành một tensor có giá trị số. Đây là điều bắt buộc để xây dựng mô hình. Tất cả các biến độc lập cần phải được chuyển đổi thành loại tenxơ thích hợp.

Dưới đây chúng tôi viết mã để cho bạn biết điều gì đang xảy ra đằng sau feature_column.numeric_column. Chúng tôi sẽ in giá trị được chuyển đổi cho tuổi Nó nhằm mục đích giải thích, do đó không cần phải hiểu mã python. Bạn có thể tham khảo tài liệu chính thức để hiểu mã.

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.]]

Các giá trị hoàn toàn giống như trong df_train

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

Theo tài liệu của TensorFlow, có nhiều cách khác nhau để chuyển đổi dữ liệu phân loại. Nếu danh sách từ vựng của một đối tượng đã được biết và không có nhiều giá trị, bạn có thể tạo cột phân loại bằng categorical_column_with_vocabulary_list. Nó sẽ gán cho tất cả danh sách từ vựng duy nhất một ID.

Ví dụ: nếu một biến trạng thái có ba giá trị riêng biệt:

  • Chồng
  • vợ
  • Độc thân

Sau đó ba ID sẽ được quy cho. Chẳng hạn Chồng sẽ có ID 1, Vợ sẽ có ID 2, v.v.

Với mục đích minh họa, bạn có thể sử dụng mã này để chuyển đổi một biến đối tượng thành cột phân loại trong TensorFlow.

Đặc điểm giới tính chỉ có thể có hai giá trị: nam hoặc nữ. Khi chúng ta chuyển đổi đặc điểm giới tính, Tensorflow sẽ tạo 2 cột mới, một cột dành cho nam và một cột dành cho nữ. Nếu giới tính bằng nam thì cột mới nam sẽ bằng 1 và nữ sẽ bằng 0. Ví dụ này được hiển thị trong bảng bên dưới:

hàng quan hệ tình dục sau khi biến đổi Nam giới giống cái
1 Nam giới => 1 0
2 Nam giới => 1 0
3 giống cái => 0 1

Trong dòng chảy căng:

print_transformation(feature = "sex", continuous = False, size = 2)
[[1. 0.]
 [1. 0.]
 [1. 0.]
 ...
 [0. 1.]
 [1. 0.]
 [0. 1.]]

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

Dưới đây, chúng tôi đã thêm Python mã để in mã hóa. Một lần nữa, bạn không cần phải hiểu mã, mục đích là để xem sự chuyển đổi

Tuy nhiên, cách nhanh hơn để chuyển đổi dữ liệu là sử dụng phương thức categorical_column_with_hash_bucket. Việc thay đổi các biến chuỗi trong ma trận thưa thớt sẽ hữu ích. Ma trận thưa thớt là ma trận có phần lớn bằng 0. Phương pháp này sẽ giải quyết mọi thứ. Bạn chỉ cần chỉ định số lượng nhóm và cột khóa. Số lượng nhóm là số lượng nhóm tối đa mà Tensorflow có thể tạo. Cột khóa chỉ đơn giản là tên của cột cần chuyển đổi.

Trong mã bên dưới, bạn tạo một vòng lặp trên tất cả các tính năng phân loại.

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

Bước 3) Huấn luyện bộ phân loại

TensorFlow hiện cung cấp công cụ ước tính cho hồi quy tuyến tính và phân loại tuyến tính.

  • Hồi quy tuyến tính: LinearRegressor
  • Phân loại tuyến tính: LinearClassifier

Cú pháp của bộ phân loại tuyến tính giống như trong hướng dẫn về hồi quy tuyến tính ngoại trừ một đối số, n_class. Bạn cần xác định cột tính năng, thư mục mô hình và so sánh với bộ hồi quy tuyến tính; bạn có xác định số lớp. Đối với hồi quy logit, số lượng lớp bằng 2.

Mô hình sẽ tính toán trọng số của các cột chứa trong constant_features và categorical_features.

model = tf.estimator.LinearClassifier(
    n_classes = 2,
    model_dir="ongoing/train", 
    feature_columns=categorical_features+ continuous_features)

Đầu ra

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train', '_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, '_service': None, '_cluster_spec': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x181f24c898>, '_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}

Bây giờ trình phân loại đã được xác định, bạn có thể tạo hàm đầu vào. Phương pháp này giống như trong hướng dẫn hồi quy tuyến tính. Ở đây, bạn sử dụng kích thước lô là 128 và xáo trộn dữ liệu.

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)

Bạn tạo một hàm với các đối số được yêu cầu bởi công cụ ước tính tuyến tính, tức là số kỷ nguyên, số lô và xáo trộn tập dữ liệu hoặc ghi chú. Vì bạn sử dụng Gấu trúc để truyền dữ liệu vào mô hình, bạn cần xác định các biến X dưới dạng khung dữ liệu gấu trúc. Lưu ý rằng bạn lặp lại tất cả dữ liệu được lưu trữ trong TÍNH NĂNG.

Hãy huấn luyện mô hình với đối tượng model.train. Bạn sử dụng hàm được xác định trước đó để cung cấp cho mô hình các giá trị thích hợp. Lưu ý rằng bạn đặt kích thước lô thành 128 và số kỷ nguyên thành Không có. Mô hình sẽ được đào tạo qua một nghìn bước.

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 1 into ongoing/train/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 65.8282
INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)
INFO:tensorflow:global_step/sec: 118.386
INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)
INFO:tensorflow:global_step/sec: 110.542
INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)
INFO:tensorflow:global_step/sec: 199.03
INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)
INFO:tensorflow:global_step/sec: 167.488
INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)
INFO:tensorflow:global_step/sec: 220.155
INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)
INFO:tensorflow:global_step/sec: 199.016
INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)
INFO:tensorflow:global_step/sec: 197.531
INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)
INFO:tensorflow:global_step/sec: 208.479
INFO:tensorflow:loss = 22201.918, step = 901 (0.479 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 0x181f223630>

Lưu ý rằng tổn thất sau đó giảm dần trong 100 bước cuối cùng, tức là từ 901 xuống 1000.

Mức giảm cuối cùng sau một nghìn lần lặp là 5444. Bạn có thể ước tính mô hình của mình trên tập kiểm tra và xem hiệu suất. Để đánh giá hiệu suất của mô hình, bạn cần sử dụng đối tượng đánh giá. Bạn cung cấp cho mô hình bộ kiểm tra và đặt số kỷ nguyên thành 1, tức là dữ liệu sẽ chỉ được chuyển đến mô hình một lần.

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-06-02-08:28:22
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-06-02-08:28:23
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

{'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}

TensorFlow trả về tất cả số liệu bạn đã học ở phần lý thuyết. Không có gì ngạc nhiên khi độ chính xác cao do nhãn không cân bằng. Trên thực tế, mô hình hoạt động tốt hơn một chút so với phỏng đoán ngẫu nhiên. Hãy tưởng tượng mô hình dự đoán tất cả các hộ gia đình có thu nhập thấp hơn 50K, khi đó mô hình có độ chính xác là 70%. Phân tích kỹ hơn, bạn có thể thấy khả năng dự đoán và thu hồi khá thấp.

Bước 4) Cải thiện mô hình

Bây giờ bạn đã có một mô hình chuẩn, bạn có thể cố gắng cải thiện nó, tức là tăng độ chính xác. Trong hướng dẫn trước, bạn đã học cách cải thiện khả năng dự đoán bằng thuật ngữ tương tác. Trong hướng dẫn này, bạn sẽ xem lại ý tưởng này bằng cách thêm một số hạng đa thức vào hồi quy.

Hồi quy đa thức là công cụ khi có sự phi tuyến tính trong dữ liệu. Có hai cách để nắm bắt tính phi tuyến tính trong dữ liệu.

  • Thêm số hạng đa thức
  • Gộp biến liên tục thành biến phân loại

Thuật ngữ đa thức

Từ hình ảnh bên dưới, bạn có thể thấy hồi quy đa thức là gì. Đó là một phương trình với các biến X có lũy thừa khác nhau. Hồi quy đa thức bậc hai có hai biến X và X bình phương. Bậc thứ ba có ba biến X, X2và X3

Hồi quy đa thức
Hồi quy đa thức là gì

Dưới đây, chúng tôi đã xây dựng một biểu đồ có hai biến X và Y. Rõ ràng mối quan hệ này không phải là tuyến tính. Nếu chúng ta thêm hồi quy tuyến tính, chúng ta có thể thấy mô hình không thể nắm bắt được mẫu (ảnh bên trái).

Bây giờ, hãy nhìn vào hình bên trái từ hình bên dưới, chúng tôi đã thêm năm số hạng vào hồi quy (tức là y=x+x2+x3+x4+x5. Mô hình bây giờ nắm bắt mô hình tốt hơn nhiều. Đây là sức mạnh của hồi quy đa thức.

Hồi quy đa thức

Hãy quay lại ví dụ của chúng tôi. Tuổi tác không có mối quan hệ tuyến tính với thu nhập. Ở độ tuổi sớm có thể có thu nhập cố định gần bằng 0 vì trẻ em hoặc thanh thiếu niên không làm việc. Sau đó, nó tăng lên trong độ tuổi lao động và giảm dần khi nghỉ hưu. Nó thường có hình chữ U ngược. Một cách để nắm bắt mô hình này là thêm lũy thừa hai vào hồi quy.

Hãy xem liệu nó có làm tăng độ chính xác hay không.

Bạn cần thêm tính năng mới này vào tập dữ liệu và trong danh sách tính năng liên tục.

Bạn thêm biến mới vào tập dữ liệu huấn luyện và kiểm tra để viết hàm sẽ thuận tiện hơn.

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

Hàm có 3 đối số:

  • df_t: xác định tập huấn luyện
  • df_te: xác định tập kiểm tra
  • var_name = 'age': Xác định biến cần chuyển đổi

Bạn có thể sử dụng đối tượng pow(2) để bình phương biến age. Lưu ý rằng biến mới được đặt tên là 'mới'

Bây giờ hàm Square_var đã được viết, bạn có thể tạo các tập dữ liệu mới.

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

Như bạn có thể thấy, tập dữ liệu mới có thêm một tính năng nữa.

print(df_train_new.shape, df_test_new.shape)			
(32561, 16) (16281, 16)

Biến vuông được gọi là mới trong tập dữ liệu. Bạn cần thêm nó vào danh sách các tính năng liên tục.

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]

Lưu ý rằng bạn đã thay đổi thư mục của Graph. Bạn không thể đào tạo các mô hình khác nhau trong cùng một thư mục. Điều đó có nghĩa là bạn cần thay đổi đường dẫn của đối số model_dir. Nếu không, TensorFlow sẽ báo lỗi.

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': 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, '_service': None, '_cluster_spec': 
<tensorflow.python.training.server_lib.ClusterSpec object at 0x1820f04b70>, '_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_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)

Giờ đây, trình phân loại đã được thiết kế với tập dữ liệu mới, bạn có thể huấn luyện và đánh giá mô hình.

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 1 into ongoing/train1/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 81.487
INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)
INFO:tensorflow:global_step/sec: 111.169
INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)
INFO:tensorflow:global_step/sec: 128.91
INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)
INFO:tensorflow:global_step/sec: 132.546
INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)
INFO:tensorflow:global_step/sec: 162.194
INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)
INFO:tensorflow:global_step/sec: 204.852
INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)
INFO:tensorflow:global_step/sec: 188.923
INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)
INFO:tensorflow:global_step/sec: 192.041
INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)
INFO:tensorflow:global_step/sec: 197.025
INFO:tensorflow:loss = 3309.5786, step = 901 (0.507 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 0x1820f04c88>
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-06-02-08:28:37
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-06-02-08:28:39
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

{'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}

Biến bình phương đã cải thiện độ chính xác từ 0.76 lên 0.79. Hãy xem liệu bạn có thể làm tốt hơn bằng cách kết hợp thuật ngữ nhóm và thuật ngữ tương tác với nhau hay không.

Bucketization và tương tác

Như bạn đã thấy trước đây, bộ phân loại tuyến tính không thể nắm bắt chính xác mô hình thu nhập theo độ tuổi. Đó là bởi vì nó học một trọng số duy nhất cho mỗi tính năng. Để giúp trình phân loại dễ dàng hơn, một điều bạn có thể làm là đưa tính năng này vào nhóm. Bucketing biến đổi một tính năng số thành một số tính năng nhất định dựa trên phạm vi mà nó rơi vào và mỗi tính năng mới này cho biết tuổi của một người có nằm trong phạm vi đó hay không.

Với những tính năng mới này, mô hình tuyến tính có thể nắm bắt được mối quan hệ bằng cách tìm hiểu các trọng số khác nhau cho mỗi nhóm.

Trong TensorFlow, việc này được thực hiện bằng Bucketized_column. Bạn cần thêm phạm vi giá trị vào ranh giới.

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])

Bạn đã biết tuổi tác không tuyến tính với thu nhập. Một cách khác để cải thiện mô hình là thông qua sự tương tác. Theo cách nói của TensorFlow, đó là tính năng vượt trội. Tính năng chéo là một cách để tạo các tính năng mới là sự kết hợp của các tính năng hiện có, điều này có thể hữu ích cho bộ phân loại tuyến tính không thể mô hình hóa sự tương tác giữa các tính năng.

Bạn có thể chia nhỏ độ tuổi bằng một tính năng khác như giáo dục. Nghĩa là, một số nhóm có thể có thu nhập cao và những nhóm khác thì thấp (Hãy nghĩ về sinh viên tiến sĩ).

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)]

Để tạo cột đối tượng chéo, bạn sử dụng cột chéo với các biến cần gạch chéo trong ngoặc. hash_bucket_size cho biết khả năng vượt qua tối đa. Để tạo sự tương tác giữa các biến (ít nhất một biến cần phải được phân loại), bạn có thể sử dụng tf.feature_column.crossed_column. Để sử dụng đối tượng này, bạn cần thêm vào dấu ngoặc vuông biến cần tương tác và đối số thứ hai, kích thước nhóm. Kích thước nhóm là số nhóm tối đa có thể có trong một biến. Ở đây bạn đặt là 1000 vì bạn không biết chính xác số lượng nhóm

age_buckets cần phải được bình phương trước để thêm nó vào các cột tính năng. Bạn cũng thêm các tính năng mới vào các cột tính năng và chuẩn bị công cụ ước tính

base_columns = [
    age_buckets,
]

model_imp = tf.estimator.LinearClassifier(
    model_dir="ongoing/train3", 
    feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation)

Đầu ra

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, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1823021be0>, '_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)

Bạn đã sẵn sàng ước tính mô hình mới và xem liệu nó có cải thiện độ chính xác hay không.

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 1 into ongoing/train3/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 94.969
INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)
INFO:tensorflow:global_step/sec: 242.342
INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)
INFO:tensorflow:global_step/sec: 213.686
INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)
INFO:tensorflow:global_step/sec: 174.084
INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)
INFO:tensorflow:global_step/sec: 191.78
INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)
INFO:tensorflow:global_step/sec: 163.436
INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)
INFO:tensorflow:global_step/sec: 164.347
INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)
INFO:tensorflow:global_step/sec: 154.274
INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)
INFO:tensorflow:global_step/sec: 189.14
INFO:tensorflow:loss = 44.69645, step = 901 (0.531 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 0x1823021cf8>
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-06-02-08:28:52
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-06-02-08:28:54
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


{'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}

Mức độ chính xác mới là 83.58%. Nó cao hơn bốn phần trăm so với mô hình trước đó.

Cuối cùng, bạn có thể thêm thuật ngữ chính quy hóa để ngăn chặn việc trang bị quá mức.

Bước 5) Siêu tham số: Lasso & Ridge

Mô hình của bạn có thể bị ảnh hưởng quá mức or thiếu trang bị.

  • Quá khớp: Mô hình không thể khái quát hóa dự đoán cho dữ liệu mới
  • Trang bị thiếu: Mô hình không thể nắm bắt được mẫu dữ liệu. tức là hồi quy tuyến tính khi dữ liệu phi tuyến tính

Khi một mô hình có nhiều tham số và lượng dữ liệu tương đối thấp sẽ dẫn đến dự đoán kém. Hãy tưởng tượng, một nhóm chỉ có ba quan sát; mô hình sẽ tính toán trọng số cho nhóm này. Trọng lượng được sử dụng để đưa ra dự đoán; nếu các quan sát của tập kiểm tra cho nhóm cụ thể này hoàn toàn khác với tập huấn luyện thì mô hình sẽ đưa ra dự đoán sai. Trong quá trình đánh giá với tập huấn luyện, độ chính xác là tốt, nhưng không tốt với tập kiểm tra vì các trọng số được tính toán không phải là trọng số đúng để khái quát hóa mẫu. Trong trường hợp này, nó không đưa ra dự đoán hợp lý về dữ liệu chưa được nhìn thấy.

Để ngăn chặn tình trạng quá khớp, chính quy hóa cung cấp cho bạn khả năng kiểm soát sự phức tạp như vậy và làm cho nó có thể khái quát hơn. Có hai kỹ thuật chính quy hóa:

  • L1: Lasso
  • L2: Sườn núi

Trong TensorFlow, bạn có thể thêm hai siêu tham số này vào trình tối ưu hóa. Ví dụ, siêu tham số L2 càng cao thì trọng số có xu hướng rất thấp và gần bằng 2. Đường được trang bị sẽ rất phẳng, trong khi LXNUMX gần bằng XNUMX hàm ý các trọng số gần với hồi quy tuyến tính thông thường.

Bạn có thể tự mình thử giá trị khác nhau của siêu tham số và xem liệu bạn có thể tăng mức độ chính xác hay không.

Lưu ý rằng nếu bạn thay đổi siêu tham số, bạn cần xóa thư mục running/train4 nếu không mô hình sẽ bắt đầu bằng mô hình đã được đào tạo trước đó.

Hãy xem độ chính xác với sự cường điệu như thế nào

model_regu = tf.estimator.LinearClassifier(
    model_dir="ongoing/train4", feature_columns=categorical_features+base_columns+education_x_occupation+age_buckets_x_education_x_occupation,
    optimizer=tf.train.FtrlOptimizer(
        learning_rate=0.1,
        l1_regularization_strength=0.9,
        l2_regularization_strength=5))

ĐẦU RA

INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': 'ongoing/train4', '_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, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x1820d9c128>, '_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}
model_regu.train(input_fn=get_input_fn(df_train_new, 
                                      num_epochs=None,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

ĐẦU RA

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 1 into ongoing/train4/model.ckpt.
INFO:tensorflow:loss = 88.722855, step = 1
INFO:tensorflow:global_step/sec: 77.4165
INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)
INFO:tensorflow:global_step/sec: 187.889
INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)
INFO:tensorflow:global_step/sec: 201.895
INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)
INFO:tensorflow:global_step/sec: 217.992
INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)
INFO:tensorflow:global_step/sec: 193.676
INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)
INFO:tensorflow:global_step/sec: 202.195
INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)
INFO:tensorflow:global_step/sec: 216.756
INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)
INFO:tensorflow:global_step/sec: 240.215
INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)
INFO:tensorflow:global_step/sec: 220.336
INFO:tensorflow:loss = 46.938225, step = 901 (0.456 sec)
INFO:tensorflow:Saving checkpoints for 1000 into ongoing/train4/model.ckpt.
INFO:tensorflow:Loss for final step: 43.4942.


<tensorflow.python.estimator.canned.linear.LinearClassifier at 0x181ff39e48>
model_regu.evaluate(input_fn=get_input_fn(df_test_new, 
                                      num_epochs=1,
                                      n_batch = 128,
                                      shuffle=False),
                                      steps=1000)

Đầu ra

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-06-02-08:29:07
INFO:tensorflow:Graph was finalized.
INFO:tensorflow:Restoring parameters from ongoing/train4/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-06-02-08:29:09
INFO:tensorflow:Saving dict for global step 1000: accuracy = 0.83833915, accuracy_baseline = 0.76377374, auc = 0.8869794, auc_precision_recall = 0.7014905, average_loss = 0.34691378, global_step = 1000, label/mean = 0.23622628, loss = 44.12581, precision = 0.69720596, prediction/mean = 0.23662092, recall = 0.5579823





{'accuracy': 0.83833915,
 'accuracy_baseline': 0.76377374,
 'auc': 0.8869794,
 'auc_precision_recall': 0.7014905,
 'average_loss': 0.34691378,
 'global_step': 1000,
 'label/mean': 0.23622628,
 'loss': 44.12581,
 'precision': 0.69720596,
 'prediction/mean': 0.23662092,
 'recall': 0.5579823}

Với siêu tham số này, bạn sẽ tăng nhẹ số liệu về độ chính xác. Trong hướng dẫn tiếp theo, bạn sẽ tìm hiểu cách cải thiện bộ phân loại tuyến tính bằng phương thức kernel.

Tổng kết

Để huấn luyện một mô hình, bạn cần:

  • Xác định các đặc điểm: Biến độc lập: X
  • Xác định nhãn: Biến phụ thuộc: y
  • Xây dựng tập huấn luyện/kiểm tra
  • Xác định trọng lượng ban đầu
  • Xác định hàm mất: MSE
  • Tối ưu hóa mô hình: Giảm dần độ dốc
  • Định nghĩa:
    • Tỷ lệ học
    • Số thời đại
    • Kích thước lô
    • Số lớp

Trong hướng dẫn này, bạn đã học cách sử dụng API cấp cao cho trình phân loại hồi quy tuyến tính. Bạn cần xác định:

  1. Cột tính năng. Nếu liên tục: tf.feature_column.numeric_column(). Bạn có thể điền một danh sách với khả năng hiểu danh sách python
  2. Công cụ ước tính: tf.estimator.LinearClassifier(feature_columns, model_dir, n_classes = 2)
  3. Hàm nhập dữ liệu, kích thước lô và kỷ nguyên: input_fn()

Sau đó, bạn đã sẵn sàng huấn luyện, đánh giá và đưa ra dự đoán với các hàm train(), đánh giá() và dự đoán()

Để cải thiện hiệu suất của mô hình, bạn có thể:

  • Sử dụng hồi quy đa thức
  • Thuật ngữ tương tác: tf.feature_column.crossed_column
  • Thêm tham số chính quy

Tóm tắt bài viết này với: