Dua tugas pembelajaran terawasi yang paling umum adalah regresi linier dan pengklasifikasi linier. Regresi linier memprediksi nilai sementara pengklasifikasi linier memprediksi kelas. Tutorial ini difokuskan pada Linear Classifier.
Apa itu Linear Classifier?
Sebuah Linear Classifier di Mesin Belajar adalah metode untuk menemukan kelas obyek berdasarkan karakteristik untuk klasifikasi statistik. Itu membuat keputusan klasifikasi berdasarkan nilai kombinasi linier dari karakteristik suatu objek. Pengklasifikasi linier digunakan dalam masalah praktis seperti klasifikasi dokumen dan masalah yang memiliki banyak variabel.
Masalah klasifikasi mewakili sekitar 80 persen dari tugas pembelajaran mesin. Klasifikasi bertujuan untuk memprediksi probabilitas setiap kelas yang diberi satu set input. Label (yaitu, variabel dependen) adalah nilai diskrit, yang disebut kelas.
- Jika label hanya memiliki dua kelas, algoritme pembelajarannya adalah Pengklasifikasi Biner.
- Pengklasifikasi multiclass menangani label dengan lebih dari dua kelas.
Misalnya, masalah klasifikasi biner yang khas adalah memprediksi kemungkinan pelanggan melakukan pembelian kedua. Memprediksi jenis hewan yang ditampilkan pada gambar adalah masalah klasifikasi multikelas karena ada lebih dari dua jenis hewan yang ada.
Bagian teoritis dari tutorial ini menempatkan fokus utama pada kelas biner. Anda akan mempelajari lebih lanjut tentang fungsi keluaran multikelas di tutorial mendatang.
Dalam tutorial ini, Anda akan belajar
- Apa itu Linear Classifier?
- Bagaimana cara kerja pengklasifikasi biner?
- Bagaimana Mengukur kinerja Linear Classifier?
- Ketepatan
- Matriks kebingungan
- Presisi dan Sensitivitas
- Linear Classifier dengan TensorFlow
- Langkah 1) Impor data
- Langkah 2) Konversi Data
- Langkah 3) Latih Pengklasifikasi
- Langkah 4) Tingkatkan model
- Langkah 5) Hyperparameter: Lasso & Ridge
Bagaimana cara kerja pengklasifikasi biner?
Anda telah mempelajari tutorial sebelumnya bahwa suatu fungsi terdiri dari dua jenis variabel, variabel dependen dan satu set fitur (variabel independen). Dalam regresi linier, variabel dependen adalah bilangan real tanpa rentang. Tujuan utamanya adalah untuk memprediksi nilainya dengan meminimalkan kesalahan kuadrat rata-rata.
Untuk TensorFlow Binary Classifier, label dapat memiliki dua kemungkinan nilai integer. Dalam kebanyakan kasus, itu adalah [0,1] atau [1,2]. Misalnya, tujuannya adalah untuk memprediksi apakah pelanggan akan membeli suatu produk atau tidak. Label tersebut didefinisikan sebagai berikut:
- Y = 1 (pelanggan membeli produk)
- Y = 0 (pelanggan tidak membeli produk)
Model tersebut menggunakan fitur X untuk mengklasifikasikan setiap pelanggan di kelas yang paling mungkin dia ikuti, yaitu, pembeli potensial atau tidak.
Probabilitas keberhasilan dihitung dengan regresi logistik . Algoritme akan menghitung probabilitas berdasarkan fitur X dan memprediksi keberhasilan saat probabilitas ini di atas 50 persen. Secara lebih formal, probabilitas dihitung seperti yang ditunjukkan pada contoh Klasifikasi Biner TensorFlow di bawah ini:
dimana 0 adalah himpunan bobot, fitur dan b bias.
Fungsi tersebut dapat diuraikan menjadi dua bagian:
- Model linier
- Fungsi logistik
Model linier
Anda sudah terbiasa dengan cara bobot dihitung. Bobot dihitung menggunakan perkalian titik: Y adalah fungsi linier dari semua fitur x i . Jika model tidak memiliki fitur, prediksinya sama dengan bias, b.
Bobot menunjukkan arah korelasi antara fitur x i dan label y. Korelasi positif meningkatkan probabilitas kelas positif sementara korelasi negatif membawa probabilitas mendekati 0, (yaitu kelas negatif).
Model linier hanya mengembalikan bilangan real, yang tidak konsisten dengan ukuran probabilitas rentang [0,1]. Fungsi logistik diperlukan untuk mengubah keluaran model linier menjadi probabilitas,
Fungsi logistik
Fungsi logistik, atau fungsi sigmoid, memiliki bentuk S dan keluaran dari fungsi ini selalu antara 0 dan 1.
Mudah untuk mengganti keluaran dari regresi linier menjadi fungsi sigmoid. Ini menghasilkan angka baru dengan probabilitas antara 0 dan 1.
Pengklasifikasi dapat mengubah probabilitas menjadi kelas
- Nilai antara 0 hingga 0,49 menjadi kelas 0
- Nilai antara 0,5 hingga 1 menjadi kelas 1
Bagaimana Mengukur kinerja Linear Classifier?
Ketepatan
Performa keseluruhan pengklasifikasi diukur dengan metrik akurasi. Akurasi mengumpulkan semua nilai yang benar dibagi dengan jumlah total pengamatan. Misalnya, nilai akurasi 80 persen berarti model tersebut benar dalam 80 persen kasus.
Anda bisa melihat kekurangan dari metrik ini, terutama untuk kelas ketidakseimbangan. Dataset ketidakseimbangan terjadi ketika jumlah pengamatan per grup tidak sama. Katakanlah; Anda mencoba untuk mengklasifikasikan kejadian langka dengan fungsi logistik. Bayangkan pengklasifikasi mencoba memperkirakan kematian pasien setelah suatu penyakit. Dalam data tersebut, 5 persen pasien meninggal dunia. Anda dapat melatih pengklasifikasi untuk memprediksi jumlah kematian dan menggunakan metrik akurasi untuk mengevaluasi penampilan. Jika pengklasifikasi memprediksi 0 kematian untuk seluruh kumpulan data, itu akan benar dalam 95 persen kasus.
Matriks kebingungan
Cara yang lebih baik untuk menilai kinerja pengklasifikasi adalah dengan melihat matriks kebingungan.
Matriks konfusi memvisualisasikan keakuratan pengklasifikasi dengan membandingkan kelas yang sebenarnya dan kelas yang diprediksi seperti yang ditunjukkan pada contoh Pengklasifikasi Linear di atas. Matriks kebingungan biner terdiri dari kotak:
- TP: Benar Positif: Nilai yang diprediksi dengan benar diprediksi sebagai positif aktual
- FP: Nilai prediksi salah memprediksi positif aktual. yaitu, nilai negatif diprediksi sebagai positif
- FN: False Negative: Nilai positif diprediksi sebagai negatif
- TN: True Negative: Nilai yang diprediksi dengan benar diprediksi sebagai negatif sebenarnya
Dari matriks konfusi, mudah untuk membandingkan kelas yang sebenarnya dan kelas yang diprediksi.
Presisi dan Sensitivitas
Matriks kebingungan memberikan pemahaman yang baik tentang positif benar dan positif palsu. Dalam beberapa kasus, lebih disukai memiliki metrik yang lebih ringkas.
Presisi
Metrik presisi menunjukkan keakuratan kelas positif. Ini mengukur seberapa besar kemungkinan prediksi kelas positif benar.
Skor maksimum adalah 1 jika pengklasifikasi mengklasifikasikan semua nilai positif dengan sempurna. Presisi saja tidak terlalu membantu karena mengabaikan kelas negatif. Metrik biasanya dipasangkan dengan metrik Perolehan. Recall juga disebut sensitivitas atau true positive rate.
Kepekaan
Sensitivitas menghitung rasio kelas positif yang terdeteksi dengan benar. Metrik ini menunjukkan seberapa baik model mengenali kelas positif.
Linear Classifier dengan TensorFlow
Untuk tutorial ini, kami akan menggunakan kumpulan data sensus. Tujuannya adalah menggunakan variabel dalam kumpulan data sensus untuk memprediksi tingkat pendapatan. Perhatikan bahwa pendapatan adalah variabel biner
- dengan nilai 1 jika pendapatan> 50k
- 0 jika pendapatan <50k.
Variabel ini adalah label Anda
Dataset ini mencakup delapan variabel kategori:
- tempat kerja
- pendidikan
- pernikahan
- pendudukan
- hubungan
- ras
- seks
- negara Asal
Selain itu, enam variabel kontinu:
- usia
- fnlwgt.dll
- education_num
- keuntungan dalam bentuk uang
- capital_loss
- hours_week
Melalui contoh Klasifikasi TensorFlow ini, Anda akan memahami cara melatih Pengklasifikasi TensorFlow linier dengan penduga TensorFlow dan cara meningkatkan metrik akurasi.
Kami akan melanjutkan sebagai berikut:
- Langkah 1) Impor data
- Langkah 2) Konversi Data
- Langkah 3) Latih pengklasifikasi
- Langkah 4) Tingkatkan model
- Langkah 5) Hyperparameter: Lasso & Ridge
Langkah 1) Impor data
Anda pertama kali mengimpor pustaka yang digunakan selama tutorial.
import tensorflow as tfimport pandas as pd
Selanjutnya, Anda mengimpor data dari arsip UCI dan menentukan nama kolom. Anda akan menggunakan KOLOM untuk memberi nama kolom dalam bingkai data panda.
Perhatikan bahwa Anda akan melatih pengklasifikasi menggunakan bingkai data Pandas.
## Define path dataCOLUMNS = ['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"
Data yang disimpan secara online sudah dibagi antara satu set kereta dan set tes.
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)
Set kereta berisi 32.561 observasi dan set pengujian 16.281
print(df_train.shape, df_test.shape)print(df_train.dtypes)(32561, 15) (16281, 15)age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel objectdtype: object
Tensorflow membutuhkan nilai Boolean untuk melatih pengklasifikasi. Anda perlu memasukkan nilai dari string ke integer. Label disimpan sebagai objek, namun Anda perlu mengubahnya menjadi nilai numerik. Kode di bawah ini membuat kamus dengan nilai-nilai yang akan diubah dan diputar ulang di atas item kolom. Perhatikan bahwa Anda melakukan operasi ini dua kali, satu untuk pengujian kereta, satu untuk set pengujian
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]
Dalam data kereta api, ada 24.720 pendapatan di bawah 50k dan 7841 di atas. Rasionya hampir sama untuk set pengujian. Silakan lihat tutorial ini di Facets untuk lebih lanjut.
print(df_train["label"].value_counts())### The model will be correct in atleast 70% of the caseprint(df_test["label"].value_counts())## Unbalanced labelprint(df_train.dtypes)0 247201 7841Name: label, dtype: int640 124351 3846Name: label, dtype: int64age int64workclass objectfnlwgt int64education objecteducation_num int64marital objectoccupation objectrelationship objectrace objectsex objectcapital_gain int64capital_loss int64hours_week int64native_country objectlabel int64dtype: object
Langkah 2) Konversi Data
Beberapa langkah diperlukan sebelum Anda melatih pengklasifikasi linier dengan Tensorflow. Anda perlu menyiapkan fitur untuk disertakan dalam model. Dalam regresi tolok ukur, Anda akan menggunakan data asli tanpa menerapkan transformasi apa pun.
Penaksir perlu memiliki daftar fitur untuk melatih model. Oleh karena itu, data kolom perlu diubah menjadi tensor.
Praktik yang baik adalah dengan mendefinisikan dua daftar fitur berdasarkan tipenya dan kemudian meneruskannya ke feature_columns dari estimator.
Anda akan mulai dengan mengonversi fitur berkelanjutan, lalu menentukan keranjang dengan data kategorikal.
Fitur kumpulan data memiliki dua format:
- Bilangan bulat
- Obyek
Setiap fitur terdaftar dalam dua variabel berikutnya sesuai jenisnya.
## Add features to the bucket:### Define continuous listCONTI_FEATURES = ['age', 'fnlwgt','capital_gain', 'education_num', 'capital_loss', 'hours_week']### Define the categorical listCATE_FEATURES = ['workclass', 'education', 'marital', 'occupation', 'relationship', 'race', 'sex', 'native_country']
Feature_column dilengkapi dengan object numeric_column untuk membantu transformasi variabel kontinu menjadi tensor. Pada kode di bawah ini, Anda mengonversi semua variabel dari CONTI_FEATURES menjadi tensor dengan nilai numerik. Ini wajib untuk membangun model. Semua variabel independen perlu diubah menjadi jenis tensor yang tepat.
Di bawah ini kami menulis kode untuk membiarkan Anda melihat apa yang terjadi di belakang feature_column.numeric_column. Kami akan mencetak nilai yang dikonversi untuk usia Ini untuk tujuan penjelasan, oleh karena itu tidak perlu memahami kode python. Anda dapat merujuk ke dokumentasi resmi untuk memahami kode-kode tersebut.
def print_transformation(feature = "age", continuous = True, size = 2):#X = fc.numeric_column(feature)## Create feature namefeature_names = [feature]## Create dict with the datad = dict(zip(feature_names, [df_train[feature]]))## Convert ageif 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 valueinput_layer = tf.feature_column.input_layer(features=d,feature_columns=feature_columns)## Create lookup tablezero = tf.constant(0, dtype=tf.float32)where = tf.not_equal(input_layer, zero)## Return lookup tbleindices = tf.where(where)values = tf.gather_nd(input_layer, indices)## Initiate graphsess = tf.Session()## Print valueprint(sess.run(input_layer))print_transformation(feature = "age", continuous = True)[[39.][50.][38.]… [58.][22.][52.]]
Nilainya persis sama seperti di df_train
continuous_features = [tf.feature_column.numeric_column(k) for k in CONTI_FEATURES]
Menurut dokumentasi TensorFlow, ada berbagai cara untuk mengonversi data kategorikal. Jika daftar kosakata fitur diketahui dan tidak memiliki banyak nilai, dimungkinkan untuk membuat kolom kategorikal dengan kategorikal_kolom_dengan_daftar_kategori. Ini akan menetapkan ID untuk semua daftar kosakata unik.
Misalnya, jika status variabel memiliki tiga nilai berbeda:
- Suami
- Istri
- Tunggal
Kemudian tiga ID akan dikaitkan. Misalnya Suami akan memiliki ID 1, Istri memiliki ID 2 dan seterusnya.
Sebagai ilustrasi, Anda dapat menggunakan kode ini untuk mengonversi variabel objek menjadi kolom kategorikal di TensorFlow.
Fitur seks hanya dapat memiliki dua nilai: pria atau wanita. Saat kita akan mengonversi feature sex, Tensorflow akan membuat 2 kolom baru, satu untuk male dan satu untuk perempuan. Jika jenis kelamin sama dengan laki-laki, maka kolom baru laki-laki akan sama dengan 1 dan perempuan sama dengan 0. Contoh ini ditampilkan pada tabel di bawah ini:
baris |
seks |
setelah transformasi |
pria |
Perempuan |
1 |
pria |
=> |
1 |
0 |
2 |
pria |
=> |
1 |
0 |
3 |
Perempuan |
=> |
0 |
1 |
Dalam tensorflow:
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'])
Di bawah ini, kami menambahkan kode Python untuk mencetak pengkodean. Sekali lagi, Anda tidak perlu memahami kodenya, tujuannya adalah untuk melihat transformasi
Namun, cara yang lebih cepat untuk mengubah data adalah dengan menggunakan metode kategorikal_column_with_hash_bucket. Mengubah variabel string dalam matriks renggang akan berguna. Matriks renggang adalah matriks yang sebagian besar bernilai nol. Metode ini menangani semuanya. Anda hanya perlu menentukan jumlah kotak dan kolom kunci. Jumlah keranjang adalah jumlah maksimum grup yang dapat dibuat Tensorflow. Kolom kunci hanyalah nama kolom yang akan diubah.
Pada kode di bawah ini, Anda membuat loop pada semua fitur kategorikal.
categorical_features = [tf.feature_column.categorical_column_with_hash_bucket(k, hash_bucket_size=1000) for k in CATE_FEATURES]
Langkah 3) Latih Pengklasifikasi
TensorFlow saat ini menyediakan estimator untuk regresi linier dan klasifikasi linier.
- Regresi linier: LinearRegressor
- Klasifikasi linier: LinearClassifier
Sintaks dari pengklasifikasi linier sama seperti di tutorial tentang regresi linier kecuali untuk satu argumen, n_class. Anda perlu menentukan kolom fitur, direktori model dan, bandingkan dengan regresi linier; Anda telah menentukan jumlah kelas. Untuk regresi logit, jumlah kelasnya sama dengan 2.
Model tersebut akan menghitung bobot kolom yang terdapat dalam fitur_kategori dan kontinu.
model = tf.estimator.LinearClassifier(n_classes = 2,model_dir="ongoing/train",feature_columns=categorical_features+ continuous_features)
KELUARAN:
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':, '_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}
Sekarang pengklasifikasi telah ditentukan, Anda dapat membuat fungsi input. Caranya sama seperti di tutorial regresi linier. Di sini, Anda menggunakan ukuran batch 128 dan Anda mengacak data.
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)
Anda membuat fungsi dengan argumen yang diperlukan oleh penaksir linier, yaitu jumlah epoch, jumlah batch, dan mengacak dataset atau catatan. Karena Anda menggunakan metode Pandas untuk meneruskan data ke model, Anda perlu mendefinisikan variabel X sebagai bingkai data panda. Perhatikan bahwa Anda mengulang semua data yang disimpan dalam FITUR.
Mari latih model dengan objek model.train. Anda menggunakan fungsi yang ditentukan sebelumnya untuk memberi makan model dengan nilai yang sesuai. Perhatikan bahwa Anda menyetel ukuran batch ke 128 dan jumlah epoch ke None. Model akan dilatih lebih dari seribu langkah.
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 = 1INFO:tensorflow:global_step/sec: 65.8282INFO:tensorflow:loss = 52583.64, step = 101 (1.528 sec)INFO:tensorflow:global_step/sec: 118.386INFO:tensorflow:loss = 25203.816, step = 201 (0.837 sec)INFO:tensorflow:global_step/sec: 110.542INFO:tensorflow:loss = 54924.312, step = 301 (0.905 sec)INFO:tensorflow:global_step/sec: 199.03INFO:tensorflow:loss = 68509.31, step = 401 (0.502 sec)INFO:tensorflow:global_step/sec: 167.488INFO:tensorflow:loss = 9151.754, step = 501 (0.599 sec)INFO:tensorflow:global_step/sec: 220.155INFO:tensorflow:loss = 34576.06, step = 601 (0.453 sec)INFO:tensorflow:global_step/sec: 199.016INFO:tensorflow:loss = 36047.117, step = 701 (0.503 sec)INFO:tensorflow:global_step/sec: 197.531INFO:tensorflow:loss = 22608.148, step = 801 (0.505 sec)INFO:tensorflow:global_step/sec: 208.479INFO: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.
Perhatikan bahwa kerugian menurun secara berurutan selama 100 langkah terakhir, yaitu dari 901 menjadi 1000.
Kerugian akhir setelah seribu iterasi adalah 5444. Anda dapat memperkirakan model Anda pada set pengujian dan melihat kinerjanya. Untuk mengevaluasi kinerja model Anda, Anda perlu menggunakan evaluasi objek. Anda memberi makan model dengan set pengujian dan menyetel jumlah masa ke 1, yaitu, data hanya akan masuk ke model satu kali.
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:22INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train/model.ckpt-1000INFO: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:23INFO: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 menampilkan semua metrik yang Anda pelajari di bagian teoritis. Tanpa mengherankan, keakuratannya besar karena label yang tidak seimbang. Sebenarnya, performa model sedikit lebih baik daripada tebakan acak. Bayangkan jika model memprediksi semua rumah tangga dengan pendapatan di bawah 50K, maka model tersebut memiliki akurasi 70 persen. Jika dianalisis lebih dekat, Anda dapat melihat prediksi dan recall yang cukup rendah.
Langkah 4) Tingkatkan model
Sekarang Anda telah memiliki model benchmark, Anda dapat mencoba memperbaikinya, yaitu meningkatkan keakuratannya. Di tutorial sebelumnya, Anda telah mempelajari cara meningkatkan daya prediksi dengan istilah interaksi. Dalam tutorial ini, Anda akan meninjau kembali ide ini dengan menambahkan istilah polinomial ke regresi.
Regresi polinomial berperan ketika ada non-linearitas dalam data. Ada dua cara untuk menangkap non-linearitas dalam data.
- Tambahkan suku polinomial
- Kelompokkan variabel kontinu menjadi variabel kategorikal
Istilah polinomial
Dari gambar di bawah ini, Anda dapat melihat apa itu regresi polinomial. Ini adalah persamaan dengan variabel X dengan pangkat berbeda. Regresi polinomial derajat kedua memiliki dua variabel, X dan X kuadrat. Derajat ketiga memiliki tiga variabel, X, X 2 , dan X 3
Di bawah ini, kami membuat grafik dengan dua variabel, X dan Y. Jelas hubungannya tidak linier. Jika kita menambahkan regresi linier, kita dapat melihat model tidak dapat menangkap pola (gambar kiri).
Sekarang, lihat gambar kiri dari gambar di bawah, kami menambahkan lima suku ke regresi (yaitu y = x + x 2 + x 3 + x 4 + x 5. Model sekarang menangkap polanya dengan jauh lebih baik. kekuatan regresi polinomial.
Mari kembali ke contoh kita. Usia tidak berhubungan linier dengan pendapatan. Usia dini mungkin memiliki pendapatan tetap mendekati nol karena anak-anak atau kaum muda tidak bekerja. Kemudian bertambah usia kerja dan menurun saat masa pensiun. Biasanya berbentuk U Terbalik. Salah satu cara untuk menangkap pola ini adalah dengan menambahkan pangkat dua ke regresi.
Mari kita lihat apakah itu meningkatkan akurasi.
Anda perlu menambahkan fitur baru ini ke kumpulan data dan di daftar fitur berkelanjutan.
Anda menambahkan variabel baru di set data train dan pengujian, jadi akan lebih mudah untuk menulis fungsi.
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
Fungsi tersebut memiliki 3 argumen:
- df_t: tentukan set pelatihan
- df_te: tentukan set pengujian
- var_name = 'age': Tentukan variabel yang akan diubah
Anda dapat menggunakan objek pow (2) untuk mengkuadratkan usia variabel. Perhatikan bahwa variabel baru bernama 'baru'
Sekarang setelah fungsi square_var ditulis, Anda dapat membuat kumpulan data baru.
df_train_new, df_test_new = square_var(df_train, df_test, var_name = 'age')
Seperti yang Anda lihat, kumpulan data baru memiliki satu fitur lagi.
print(df_train_new.shape, df_test_new.shape)(32561, 16) (16281, 16)
Variabel persegi disebut baru dalam dataset. Anda perlu menambahkannya ke daftar fitur berkelanjutan.
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]
Perhatikan bahwa Anda mengubah direktori Grafik. Anda tidak dapat melatih model yang berbeda dalam direktori yang sama. Artinya, Anda perlu mengubah jalur argumen model_dir. Jika Anda tidak, TensorFlow akan menampilkan error.
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':, '_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)
Sekarang setelah pengklasifikasi dirancang dengan kumpulan data baru, Anda dapat melatih dan mengevaluasi model.
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 = 1INFO:tensorflow:global_step/sec: 81.487INFO:tensorflow:loss = 70077.66, step = 101 (1.228 sec)INFO:tensorflow:global_step/sec: 111.169INFO:tensorflow:loss = 49522.082, step = 201 (0.899 sec)INFO:tensorflow:global_step/sec: 128.91INFO:tensorflow:loss = 107120.57, step = 301 (0.776 sec)INFO:tensorflow:global_step/sec: 132.546INFO:tensorflow:loss = 12814.152, step = 401 (0.755 sec)INFO:tensorflow:global_step/sec: 162.194INFO:tensorflow:loss = 19573.898, step = 501 (0.617 sec)INFO:tensorflow:global_step/sec: 204.852INFO:tensorflow:loss = 26381.986, step = 601 (0.488 sec)INFO:tensorflow:global_step/sec: 188.923INFO:tensorflow:loss = 23417.719, step = 701 (0.529 sec)INFO:tensorflow:global_step/sec: 192.041INFO:tensorflow:loss = 23946.049, step = 801 (0.521 sec)INFO:tensorflow:global_step/sec: 197.025INFO: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.
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:37INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train1/model.ckpt-1000INFO: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:39INFO: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}
Variabel kuadrat meningkatkan akurasi dari 0,76 menjadi 0,79. Mari kita lihat apakah Anda dapat melakukan lebih baik dengan menggabungkan pengelompokan dan istilah interaksi bersama-sama.
Bucketization dan interaksi
Seperti yang Anda lihat sebelumnya, pengklasifikasi linier tidak dapat menangkap pola pendapatan usia dengan benar. Itu karena ia mempelajari satu bobot untuk setiap fitur. Untuk mempermudah pengklasifikasi, satu hal yang dapat Anda lakukan adalah mengelompokkan fitur tersebut. Pengelompokan mengubah fitur numerik menjadi beberapa fitur tertentu berdasarkan kisarannya, dan setiap fitur baru ini menunjukkan apakah usia seseorang termasuk dalam kisaran tersebut.
Dengan fitur baru ini, model linier dapat menangkap hubungan dengan mempelajari bobot yang berbeda untuk setiap keranjang.
Di TensorFlow, ini dilakukan dengan bucketized_column. Anda perlu menambahkan rentang nilai di batas.
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])
Anda sudah tahu bahwa usia tidak linier dengan penghasilan. Cara lain untuk meningkatkan model adalah melalui interaksi. Dalam kata TensorFlow, ini adalah persilangan fitur. Persilangan fitur adalah cara untuk membuat fitur baru yang merupakan kombinasi dari yang sudah ada, yang dapat berguna untuk pengklasifikasi linier yang tidak dapat mencontohkan interaksi antar fitur.
Anda dapat membagi usia dengan fitur lain seperti pendidikan. Artinya, beberapa kelompok cenderung berpenghasilan tinggi dan yang lain rendah (Pikirkan tentang mahasiswa Ph.D.).
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)]
Untuk membuat kolom fitur silang, Anda menggunakan crossed_column dengan variabel untuk disilangkan dalam tanda kurung. Hash_bucket_size menunjukkan kemungkinan persimpangan maksimum. Untuk membuat interaksi antar variabel (setidaknya satu variabel harus dikategorikan), Anda dapat menggunakan tf.feature_column.crossed_column. Untuk menggunakan objek ini, Anda perlu menambahkan variabel dalam tanda kurung siku untuk berinteraksi dan argumen kedua, ukuran keranjang. Ukuran keranjang adalah jumlah maksimum grup yang memungkinkan dalam variabel. Di sini Anda menetapkannya pada 1000 karena Anda tidak mengetahui jumlah pasti grupnya
age_buckets perlu dikuadratkan sebelum menambahkannya ke kolom fitur. Anda juga menambahkan fitur baru ke kolom fitur dan menyiapkan estimator
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)
KELUARAN
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':, '_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)
Anda siap memperkirakan model baru dan melihat apakah model tersebut meningkatkan keakuratannya.
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 = 1INFO:tensorflow:global_step/sec: 94.969INFO:tensorflow:loss = 50.334488, step = 101 (1.054 sec)INFO:tensorflow:global_step/sec: 242.342INFO:tensorflow:loss = 56.153225, step = 201 (0.414 sec)INFO:tensorflow:global_step/sec: 213.686INFO:tensorflow:loss = 45.792007, step = 301 (0.470 sec)INFO:tensorflow:global_step/sec: 174.084INFO:tensorflow:loss = 37.485672, step = 401 (0.572 sec)INFO:tensorflow:global_step/sec: 191.78INFO:tensorflow:loss = 56.48449, step = 501 (0.524 sec)INFO:tensorflow:global_step/sec: 163.436INFO:tensorflow:loss = 32.528934, step = 601 (0.612 sec)INFO:tensorflow:global_step/sec: 164.347INFO:tensorflow:loss = 37.438057, step = 701 (0.607 sec)INFO:tensorflow:global_step/sec: 154.274INFO:tensorflow:loss = 61.1075, step = 801 (0.647 sec)INFO:tensorflow:global_step/sec: 189.14INFO: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.
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:52INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train3/model.ckpt-1000INFO: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:54INFO: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}
Tingkat akurasi baru adalah 83,58 persen. Ini empat persen lebih tinggi dari model sebelumnya.
Terakhir, Anda dapat menambahkan istilah regularisasi untuk mencegah overfitting.
Langkah 5) Hyperparameter: Lasso & Ridge
Model Anda bisa mengalami overfitting atau underfitting .
- Overfitting: Model tidak dapat menggeneralisasi prediksi ke data baru
- Underfitting: Model tidak dapat menangkap pola data. yaitu, regresi linier bila datanya non-linier
Jika suatu model memiliki banyak parameter dan jumlah data yang relatif rendah, hal itu menyebabkan prediksi yang buruk. Bayangkan, satu kelompok hanya memiliki tiga pengamatan; model akan menghitung bobot untuk grup ini. Bobot digunakan untuk membuat prediksi; jika pengamatan set pengujian untuk grup tertentu ini sama sekali berbeda dari set pelatihan, maka model akan membuat prediksi yang salah. Selama evaluasi dengan set pelatihan, keakuratannya bagus, tetapi tidak bagus dengan set pengujian karena bobot yang dihitung tidak benar untuk menggeneralisasi pola. Dalam hal ini, itu tidak membuat prediksi yang masuk akal pada data yang tidak terlihat.
Untuk mencegah overfitting, regularisasi memberi Anda kemungkinan untuk mengontrol kompleksitas tersebut dan membuatnya lebih dapat digeneralisasi. Ada dua teknik regularisasi:
- L1: Lasso
- L2: Punggung
Di TensorFlow, Anda dapat menambahkan dua hyperparameter ini di pengoptimal. Misalnya, semakin tinggi hyperparameter L2, bobotnya cenderung sangat rendah dan mendekati nol. Garis yang dipasang akan menjadi sangat datar, sedangkan L2 yang mendekati nol menyiratkan bahwa bobotnya mendekati regresi linier biasa.
Anda dapat mencoba sendiri nilai hyperparameter yang berbeda dan melihat apakah Anda dapat meningkatkan tingkat akurasi.
Perhatikan bahwa jika Anda mengubah hyperparameter, Anda perlu menghapus folder berkelanjutan / train4, jika tidak, model akan mulai dengan model yang dilatih sebelumnya.
Mari kita lihat bagaimana akurasinya dengan hype tersebut
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))
OUPUT
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':, '_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)
OUPUT
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 = 1INFO:tensorflow:global_step/sec: 77.4165INFO:tensorflow:loss = 50.38778, step = 101 (1.294 sec)INFO:tensorflow:global_step/sec: 187.889INFO:tensorflow:loss = 55.38014, step = 201 (0.535 sec)INFO:tensorflow:global_step/sec: 201.895INFO:tensorflow:loss = 46.806694, step = 301 (0.491 sec)INFO:tensorflow:global_step/sec: 217.992INFO:tensorflow:loss = 38.68271, step = 401 (0.460 sec)INFO:tensorflow:global_step/sec: 193.676INFO:tensorflow:loss = 56.99398, step = 501 (0.516 sec)INFO:tensorflow:global_step/sec: 202.195INFO:tensorflow:loss = 33.263622, step = 601 (0.497 sec)INFO:tensorflow:global_step/sec: 216.756INFO:tensorflow:loss = 37.7902, step = 701 (0.459 sec)INFO:tensorflow:global_step/sec: 240.215INFO:tensorflow:loss = 61.732605, step = 801 (0.416 sec)INFO:tensorflow:global_step/sec: 220.336INFO: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.
model_regu.evaluate(input_fn=get_input_fn(df_test_new,num_epochs=1,n_batch = 128,shuffle=False),steps=1000)
KELUARAN
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:07INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from ongoing/train4/model.ckpt-1000INFO: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:09INFO: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}
Dengan hyperparameter ini, Anda sedikit meningkatkan metrik akurasi. Dalam tutorial berikutnya, Anda akan mempelajari cara meningkatkan pengklasifikasi linier menggunakan metode kernel.
Ringkasan
Untuk melatih model, Anda perlu:
- Definisikan fitur-fiturnya: Variabel independen: X
- Tentukan labelnya: Variabel terikat: y
- Buat set pelatihan / pengujian
- Tentukan bobot awal
- Tentukan fungsi kerugian: MSE
- Optimalkan model: Penurunan gradien
- Menetapkan:
- Kecepatan pembelajaran
- Jumlah periode
- Ukuran batch
- Jumlah kelas
Dalam tutorial ini, Anda telah mempelajari cara menggunakan API tingkat tinggi untuk pengklasifikasi regresi linier. Anda perlu mendefinisikan:
- Kolom fitur. Jika kontinu: tf.feature_column.numeric_column (). Anda dapat mengisi daftar dengan pemahaman daftar python
- Estimator: tf.estimator.LinearClassifier (feature_columns, model_dir, n_classes = 2)
- Sebuah fungsi untuk mengimpor data, ukuran batch dan epoch: input_fn ()
Setelah itu anda siap untuk melatih, mengevaluasi dan membuat prediksi dengan train (), evalu () dan predict ()
Untuk meningkatkan kinerja model, Anda dapat:
- Gunakan regresi polinomial
- Istilah interaksi: tf.feature_column.crossed_column
- Tambahkan parameter regularisasi