Kami sedang melakukan proyek pembelajaran mesin dengan Python. Bagian 3



Mesin Pembelajaran Lengkap Walk-Through dengan Python: Bagian Tiga

Banyak orang tidak suka model pembelajaran mesin itu kotak hitam : kami memasukkan data ke dalamnya dan mendapatkan jawaban tanpa penjelasan apa pun - seringkali jawaban yang sangat akurat. Pada artikel ini, kami akan mencoba memahami bagaimana model yang kami buat membuat prediksi dan apa yang bisa diceritakan tentang masalah yang kami pecahkan. Dan kami menyimpulkan dengan diskusi tentang bagian paling penting dari proyek pembelajaran mesin: kami mendokumentasikan apa yang telah kami lakukan dan menyajikan hasilnya.

Pada bagian pertama, kami memeriksa pembersihan data, analisis eksplorasi, desain, dan pemilihan fitur. Pada bagian kedua, kami mempelajari pengisian data yang hilang, implementasi dan perbandingan model pembelajaran mesin, penyetelan hyperparametric menggunakan pencarian acak dengan validasi silang, dan, akhirnya, evaluasi model yang dihasilkan.

Semua kode proyek ada di GitHub. Dan Notebook Jupyter ketiga yang terkait dengan artikel ini ada di sini . Anda dapat menggunakannya untuk proyek Anda!

Jadi, kami sedang mengerjakan solusi untuk masalah menggunakan pembelajaran mesin, atau lebih tepatnya, menggunakan regresi terawasi. Berdasarkan data energi dari bangunan di New York, kami menciptakan model yang memprediksi Skor Bintang Energi. Kami telah memperoleh model " regresi berbasis-peningkatan gradien ", yang mampu memprediksi dalam kisaran 9,1 poin (dalam kisaran dari 1 hingga 100) berdasarkan data uji.

Model interpretasi


Gradien meningkatkan regresi terletak kira-kira di tengah skala interpretabilitas model : model itu sendiri kompleks, tetapi terdiri dari ratusan pohon keputusan yang cukup sederhana. Ada tiga cara untuk memahami cara kerja model kami:

  1. Nilai pentingnya gejala .
  2. Visualisasikan salah satu pohon keputusan.
  3. Menerapkan metode LIME - Penjelasan Agnostik Model-Interpretable Lokal , penjelasan model-independen yang diartikan lokal.

Dua metode pertama adalah karakteristik ansambel pohon, dan yang ketiga, seperti yang dapat Anda pahami dari namanya, dapat diterapkan pada model pembelajaran mesin apa pun. LIME adalah pendekatan yang relatif baru, ini merupakan langkah maju yang signifikan dalam upaya menjelaskan operasi pembelajaran mesin .

Pentingnya gejala


Pentingnya tanda memungkinkan Anda untuk melihat hubungan setiap tanda dengan tujuan perkiraan. Rincian teknis dari metode ini sangat kompleks (penurunan pengotor rata-rata atau penurunan kesalahan karena dimasukkannya sifat diukur ), tetapi kita dapat menggunakan nilai relatif untuk memahami sifat mana yang lebih relevan. Di Scikit-Learn, Anda dapat mengekstrak pentingnya atribut dari ansambel “siswa” berbasis pohon.

Dalam kode di bawah ini, model adalah model kami yang terlatih, dan menggunakan model.feature_importances_ Anda dapat menentukan pentingnya atribut. Kemudian kami mengirimnya ke bingkai data Pandas dan menampilkan 10 atribut paling penting:

 import pandas as pd # model is the trained model importances = model.feature_importances_ # train_features is the dataframe of training features feature_list = list(train_features.columns) # Extract the feature importances into a dataframe feature_results = pd.DataFrame({'feature': feature_list,'importance': importances}) # Show the top 10 most important feature_results = feature_results.sort_values('importance',ascending = False).reset_index(drop=True) feature_results.head(10) 





Fitur yang paling penting adalah Site EUI ( Intensitas Konsumsi Energi ) dan Weather Normalized Site Electricity Intensity , yang mencakup lebih dari 66% dari total kepentingan. Sudah pada atribut ketiga, kepentingannya sangat berkurang, ini menunjukkan bahwa kita tidak perlu menggunakan semua 64 atribut untuk mencapai akurasi perkiraan yang tinggi (dalam notebook Jupyter, teori ini diuji hanya dengan menggunakan 10 atribut paling penting, dan modelnya tidak terlalu akurat).

Berdasarkan hasil ini, salah satu pertanyaan awal akhirnya dapat dijawab: indikator paling penting dari Skor Bintang Energi adalah Situs EUI dan Intensitas Listrik Situs Normalisasi Cuaca. Kami tidak akan pergi terlalu jauh ke dalam hutan tentang pentingnya atribut , kami hanya akan mengatakan bahwa dengan mereka Anda dapat mulai memahami mekanisme peramalan oleh model.

Visualisasi dari pohon keputusan tunggal


Sulit untuk memahami keseluruhan model regresi berdasarkan peningkatan gradien, yang tidak dapat dikatakan tentang pohon keputusan individu. Anda dapat memvisualisasikan pohon apa saja menggunakan fungsi Scikit-Learn- export_graphviz . Pertama, ekstrak pohon dari ensemble, dan kemudian simpan sebagai file-dot:

 from sklearn import tree # Extract a single tree (number 105) single_tree = model.estimators_[105][0] # Save the tree to a dot file tree.export_graphviz(single_tree, out_file = 'images/tree.dot', feature_names = feature_list) 

Menggunakan visualizer Graphviz, konversikan file-dot menjadi png dengan mengetik:

dot -Tpng images/tree.dot -o images/tree.png

Punya pohon keputusan lengkap:



Sedikit merepotkan! Meskipun pohon ini hanya memiliki 6 lapisan, sulit untuk melacak semua transisi. Mari kita mengubah export_graphviz fungsi export_graphviz dan membatasi kedalaman pohon menjadi dua lapisan:



Setiap simpul (persegi panjang) dari pohon berisi empat baris:

  1. Pertanyaan yang diajukan tentang nilai salah satu tanda dimensi tertentu: itu tergantung pada arah mana kita akan keluar dari simpul ini.
  2. Mse adalah ukuran kesalahan dalam suatu node.
  3. Samples - jumlah sampel data (pengukuran) dalam node.
  4. Value - penilaian sasaran untuk semua sampel data dalam simpul.


Pisahkan simpul.

(Daun hanya mengandung 2.4., Karena mereka mewakili skor akhir dan tidak memiliki simpul anak).

Peramalan untuk pengukuran yang diberikan dalam pohon keputusan dimulai dari simpul atas - root, dan kemudian turun turun pohon. Di setiap node, Anda perlu menjawab pertanyaan "ya" atau "tidak". Sebagai contoh, ilustrasi sebelumnya bertanya: "Apakah situs yang dibangun EUI kurang dari atau sama dengan 68,95?" Jika ya, algoritme tersebut menuju ke simpul anak kanan, jika tidak, kemudian ke kiri.

Prosedur ini diulangi pada setiap lapisan pohon sampai algoritme mencapai simpul daun pada lapisan terakhir (simpul-simpul ini tidak diperlihatkan dalam ilustrasi dengan pohon yang direduksi). Prakiraan untuk dimensi apa pun di lembar kerja adalah value . Jika beberapa pengukuran sampai pada sheet, maka masing-masing dari mereka akan menerima perkiraan yang sama. Dengan meningkatnya kedalaman pohon, kesalahan pada data pelatihan akan berkurang, karena akan ada lebih banyak daun dan sampel akan dibagi lebih hati-hati. Namun, pohon yang terlalu dalam akan menyebabkan pelatihan ulang pada data pelatihan dan tidak akan bisa menggeneralisasi data uji.

Pada artikel kedua, kami mengatur jumlah model hyperparameters yang mengontrol setiap pohon, misalnya, kedalaman maksimum pohon dan jumlah minimum sampel yang diperlukan untuk setiap lembar. Kedua parameter ini sangat memengaruhi keseimbangan antara pembelajaran yang berlebihan dan yang kurang, serta visualisasi pohon keputusan akan memungkinkan kami untuk memahami cara kerja pengaturan ini.

Meskipun kita tidak dapat mempelajari semua pohon dalam model, analisis salah satunya akan membantu untuk memahami bagaimana masing-masing "siswa" memprediksi. Metode berbasis diagram alur ini sangat mirip dengan bagaimana seseorang membuat keputusan. Ensemble pohon keputusan menggabungkan prakiraan berbagai pohon secara individu, yang memungkinkan Anda membuat model yang lebih akurat dengan variabilitas yang lebih sedikit. Ansambel seperti itu sangat akurat dan mudah dijelaskan.

Penjelasan Ketergantungan Model Interpretable Lokal (LIME)


Alat terakhir yang dapat digunakan untuk mencari tahu bagaimana model kami “berpikir”. LIME memungkinkan Anda menjelaskan bagaimana perkiraan tunggal dihasilkan untuk model pembelajaran mesin apa pun . Untuk melakukan ini, secara lokal, di sebelah beberapa pengukuran, model yang disederhanakan dibuat berdasarkan model sederhana seperti regresi linier (perincian dijelaskan dalam karya ini: https://arxiv.org/pdf/1602.04938.pdf ).

Kami akan menggunakan metode LIME untuk mempelajari perkiraan yang keliru dari model kami dan memahami mengapa itu salah.

Pertama, kami menemukan ramalan yang salah ini. Untuk melakukan ini, kami akan melatih model, menghasilkan perkiraan, dan memilih nilai dengan kesalahan terbesar:

 from sklearn.ensemble import GradientBoostingRegressor # Create the model with the best hyperparamters model = GradientBoostingRegressor(loss='lad', max_depth=5, max_features=None, min_samples_leaf=6, min_samples_split=6, n_estimators=800, random_state=42) # Fit and test on the features model.fit(X, y) model_pred = model.predict(X_test) # Find the residuals residuals = abs(model_pred - y_test) # Extract the most wrong prediction wrong = X_test[np.argmax(residuals), :] print('Prediction: %0.4f' % np.argmax(residuals)) print('Actual Value: %0.4f' % y_test[np.argmax(residuals)]) 

Prediksi: 12.8615
Nilai Aktual: 100.0000

Kemudian kami membuat explainer dan memberikannya data pelatihan, informasi mode, label untuk data pelatihan dan nama-nama atribut. Sekarang dimungkinkan untuk menyampaikan data pengamatan dan fungsi perkiraan ke penjelajah, dan kemudian meminta mereka untuk menjelaskan alasan kesalahan perkiraan.

 import lime # Create a lime explainer object explainer = lime.lime_tabular.LimeTabularExplainer(training_data = X, mode = 'regression', training_labels = y, feature_names = feature_list) # Explanation for wrong prediction exp = explainer.explain_instance(data_row = wrong, predict_fn = model.predict) # Plot the prediction explaination exp.as_pyplot_figure(); 

Bagan Penjelasan Prakiraan:



Cara menafsirkan diagram: setiap rekaman sepanjang sumbu Y menunjukkan satu nilai variabel, dan bilah merah dan hijau mencerminkan pengaruh nilai ini pada perkiraan. Misalnya, menurut catatan tertinggi, pengaruh Site EUI lebih dari 95,90, sebagai hasilnya, sekitar 40 poin dikurangkan dari perkiraan. Menurut catatan kedua, pengaruh Weather Normalized Site Electricity Intensity kurang dari 3,80, dan karenanya sekitar 10 poin ditambahkan ke perkiraan. Perkiraan akhir adalah jumlah intersep dan efek dari masing-masing nilai yang tercantum.

Mari kita melihatnya dengan cara lain dan memanggil metode .show_in_notebook() :

 # Show the explanation in the Jupyter Notebook exp.show_in_notebook() 



Proses pengambilan keputusan oleh model ditunjukkan di sebelah kiri: efek pada perkiraan setiap variabel ditampilkan secara visual. Tabel di sebelah kanan menunjukkan nilai aktual dari variabel untuk pengukuran yang diberikan.

Dalam hal ini, model memperkirakan sekitar 12 poin, tetapi kenyataannya adalah 100. Pada awalnya Anda mungkin bertanya-tanya mengapa ini terjadi, tetapi jika Anda menganalisis penjelasannya, ternyata ini bukan asumsi yang sangat berani, tetapi hasil perhitungan berdasarkan nilai-nilai tertentu. Site EUI relatif tinggi dan orang dapat mengharapkan Skor Bintang Energi yang rendah (karena sangat dipengaruhi oleh EUI), yang dilakukan oleh model kami. Tetapi dalam kasus ini, logika ini ternyata salah, karena sebenarnya bangunan tersebut menerima Skor Bintang Energi tertinggi - 100.

Kesalahan model dapat mengganggu Anda, tetapi penjelasan seperti itu akan membantu Anda memahami mengapa model itu salah. Selain itu, berkat penjelasannya, Anda dapat mulai menggali mengapa bangunan mendapatkan skor tertinggi meskipun Situs EUI tinggi. Mungkin kita akan belajar sesuatu yang baru tentang tugas kita yang akan menghindari perhatian kita jika kita tidak mulai menganalisis kesalahan model. Alat seperti itu tidak ideal, tetapi mereka dapat sangat memudahkan pemahaman model dan membuat keputusan yang lebih baik .

Dokumentasi pekerjaan dan presentasi hasil


Banyak proyek tidak terlalu memperhatikan dokumentasi dan laporan. Anda dapat melakukan analisis terbaik di dunia, tetapi jika Anda tidak menyajikan hasilnya dengan benar , itu tidak akan menjadi masalah!

Dengan mendokumentasikan proyek analisis data, kami mengemas semua versi data dan kode sehingga orang lain dapat mereproduksi atau mengumpulkan proyek. Ingatlah bahwa kode dibaca lebih sering daripada ditulis, oleh karena itu pekerjaan kita harus jelas bagi orang lain, dan bagi kita, jika kita kembali ke sana dalam beberapa bulan. Karena itu, masukkan komentar yang berguna ke dalam kode dan jelaskan keputusan Anda. Jupyter Notebooks adalah alat yang hebat untuk mendokumentasikan, mereka membiarkan Anda pertama kali menjelaskan solusi dan kemudian menunjukkan kode.

Selain itu, Jupyter Notebook adalah platform yang baik untuk berinteraksi dengan spesialis lain. Dengan menggunakan ekstensi untuk buku catatan, Anda dapat menyembunyikan kode dari laporan akhir , karena betapa pun sulitnya untuk percaya, tidak semua orang ingin melihat banyak kode dalam dokumen!

Anda mungkin tidak ingin memeras, tetapi tunjukkan semua detailnya. Namun, penting untuk memahami audiens Anda ketika mempresentasikan proyek Anda, dan menyiapkan laporan yang sesuai . Berikut adalah contoh ringkasan esensi dari proyek kami:

  1. Dengan menggunakan data konsumsi energi bangunan di New York, Anda dapat membangun model yang memprediksi jumlah Energy Star Points dengan kesalahan 9,1 poin.
  2. Situs EUI dan Intensitas Listrik Normalisasi Cuaca adalah faktor utama yang mempengaruhi perkiraan.

Kami menulis deskripsi terperinci dan kesimpulan di Notebook Jupyter, tetapi alih-alih PDF, kami mengonversi file .tex ke Latx , yang kemudian kami edit di texStudio , dan versi yang dihasilkan dikonversi ke PDF. Faktanya adalah bahwa hasil ekspor default dari Jupyter ke PDF terlihat cukup baik, tetapi itu dapat sangat ditingkatkan hanya dalam beberapa menit pengeditan. Selain itu, Lateks adalah sistem persiapan dokumen yang kuat yang berguna untuk dimiliki.

Pada akhirnya, nilai pekerjaan kita ditentukan oleh keputusan yang membantu untuk membuat, dan sangat penting untuk dapat "mengirimkan barang secara langsung". Dengan mendokumentasikan dengan benar, kami membantu orang lain mereproduksi hasil kami dan memberi kami umpan balik, yang akan memungkinkan kami untuk menjadi lebih berpengalaman dan mengandalkan hasil yang diperoleh di masa depan.

Kesimpulan


Dalam seri publikasi kami, kami telah membahas tutorial pembelajaran mesin dari awal hingga akhir. Kami mulai dengan membersihkan data, kemudian menciptakan model, dan pada akhirnya kami belajar bagaimana menafsirkannya. Ingat struktur umum proyek pembelajaran mesin:

  1. Membersihkan dan memformat data.
  2. Analisis data eksplorasi.
  3. Desain dan pemilihan fitur.
  4. Perbandingan metrik beberapa model pembelajaran mesin.
  5. Tuning hyperparametric model terbaik.
  6. Evaluasi model terbaik pada set data uji.
  7. Interpretasi hasil model.
  8. Kesimpulan dan laporan yang terdokumentasi dengan baik.

Seperangkat langkah dapat bervariasi tergantung pada proyek, dan pembelajaran mesin sering berulang daripada linier, jadi panduan ini akan membantu Anda di masa depan. Kami harap Anda sekarang dapat dengan yakin mengimplementasikan proyek Anda, tetapi ingat: tidak ada yang bertindak sendiri! Jika Anda membutuhkan bantuan, ada banyak komunitas yang sangat berguna di mana Anda akan diberikan saran.

Sumber-sumber ini dapat membantu Anda:

Source: https://habr.com/ru/post/id426771/


All Articles