Anotasi
Pada artikel ini saya ingin berbagi pengalaman saya sendiri dengan pembelajaran mesin di gudang data di Vertica.
Sejujurnya, saya bukan analis ahli yang dapat menjelaskan secara rinci berbagai metode penelitian dan algoritma prediksi data. Namun tetap, sebagai ahli Vertica dan memiliki pengalaman dasar dengan ML, saya akan mencoba berbicara tentang cara-cara bekerja dengan analisis prediktif di Vertica menggunakan fungsionalitas server bawaan dan bahasa R.
Perpustakaan Pembelajaran Mesin Vertica
Dimulai dengan versi 7, Vertica telah diperluas dengan perpustakaan Machine Learning, yang dengannya Anda dapat:
- Siapkan contoh data untuk pembelajaran mesin
- melatih model pembelajaran mesin pada data yang disiapkan;
- melakukan analisis prediksi data penyimpanan pada model pembelajaran mesin yang disimpan.
Perpustakaan segera hadir dengan instalasi Vertica untuk semua versi, termasuk Komunitas gratis. Bekerja dengannya dibingkai dalam bentuk panggilan ke fungsi dari bawah SQL, yang dijelaskan secara rinci dalam dokumentasi dengan contoh penggunaan pada data demo yang disiapkan.
Contoh bekerja dengan ML di Vertica
Sebagai contoh sederhana tentang cara kerja ML, saya mengambil data demo mtcars yang merupakan bagian dari contoh data ML untuk Vertica. Data ini mencakup dua tabel:
- mtcars_train - data disiapkan untuk model pembelajaran mesin pelatihan
- mtcars - data untuk analisis
Mari kita lihat data untuk pelatihan:
=>SELECT * FROM mtcars_train;

Dalam kumpulan data pada model mobil, karakteristiknya dijelaskan. Mari kita coba latih pembelajaran mesin sehingga sesuai dengan karakteristik mobil, dimungkinkan untuk memprediksi jenis gearbox mana yang terlibat dalam mobil - kotak manual atau gearbox otomatis. Untuk melakukan ini, kita perlu membangun model regresi logistik pada data yang disiapkan, menemukan ketergantungan tipe kotak bidang "am" dan bidang berat kendaraan "wt", jumlah silinder "cyl" dan jumlah kecepatan dalam kotak "gear":
=>SELECT LOGISTIC_REG('logistic_reg_mtcars', 'mtcars_train', 'am', 'cyl, wt, gear'); Finished in 19 iterations
Fungsi yang dipanggil menganalisis hubungan antara am dan bidang cyl, wt, gear, mengungkapkan rumus dependensi dan menulis hasil simulasi ketergantungan dalam database Vertica dalam model βlogistic_reg_mtcarsβ. Dengan menggunakan model yang disimpan ini, Anda sekarang dapat menganalisis data pada mobil dan memprediksi ketersediaan gearbox otomatis.
Informasi tentang model dapat dilihat:
=>SELECT GET_MODEL_SUMMARY(USING PARAMETERS model_name='logistic_reg_mtcars');

Sekarang kita menggunakan model pada data untuk mobil, menyimpan hasilnya dalam tabel baru:
=>CREATE TABLE mtcars_predict_results AS ( SELECT car_model, am, PREDICT_LOGISTIC_REG(cyl, wt, gear USING PARAMETERS model_name='logistic_reg_mtcars') AS prediction FROM mtcars );
Dan membandingkan nilai riil am dengan yang diperoleh dalam prediksi prediksi:
=>SELECT * FROM mtcars_predict_results;

Dalam hal ini, perkiraan untuk 100% bertepatan dengan jenis kotak asli dalam model yang disajikan. Dalam hal mempersiapkan data baru untuk pelatihan, Anda harus menghapus dan menyimpan kembali model.
Fungsionalitas ML di Vertica
Pustaka Vertica ML mendukung jenis analisis prediktif berikut:
- Peramalan:
- Regresi linier
- Hutan acak untuk regresi
- SVM (Support Vector Machine) untuk Regresi
- Klasifikasi:
- Regresi logistik
- Teluk naif
- Hutan Acak untuk Klasifikasi
- SVM (Support Vector Machine) untuk Klasifikasi
- Pengelompokan:
Untuk menyiapkan data untuk pelatihan, fungsionalitas berikut ini disajikan:
- Penyeimbangan data
- Pembersihan emisi
- Pengkodean nilai-nilai kategorikal (tekstual)
- Mengganti Data yang Hilang
- Normalisasi data
- Analisis komponen utama
- Pengambilan sampel data
- Dekomposisi nilai singular
Mempertimbangkan fungsi ML di Vertica, kita dapat mengatakan bahwa perpustakaan bawaan memungkinkan kita untuk memecahkan berbagai masalah yang cukup luas, tetapi tidak memiliki jaminan simpanan untuk mempelajari pola dan dependensi dalam data. Ada beberapa fungsi untuk menyiapkan data untuk pembelajaran mesin, tetapi tanpa memvisualisasikan distribusi data dalam bentuk grafik, hanya pakar analisis dengan pengetahuan ahli tentang data yang dianalisis yang dapat "menyiapkan" data tersebut dan melatih model pembelajaran di atasnya.
R Studio dengan Vertica
Untuk analisis data prediksi yang lebih menyeluruh dan interaktif, bahasa R sangat sesuai, yang memiliki lingkungan visual untuk bekerja dengan data R Studio. Keuntungan nyata menggunakan R dengan Vertica adalah:
- interaktivitas lingkungan dengan kemampuan untuk menyelamatkan keadaan untuk analisis lebih lanjut setelah menjalankan selanjutnya;
- tampilan visual data dalam bentuk tabel dan grafik;
- Kekuatan bahasa R untuk bekerja dengan set data;
- berbagai algoritma analisis prediktif mirip dengan yang disajikan dalam Vertica ML.
Kerugian bekerja dengan R dengan data besar adalah persyaratan RAM, kecepatan bekerja dengan array data besar, dan kebutuhan untuk mengimpor dan mengekspor data Vertica. Kekurangan ini tercakup oleh kemampuan untuk menanamkan fungsi R tertulis untuk eksekusi langsung pada sebuah cluster di Vertica, yang akan dijelaskan di bawah ini.
Pengantar kecil untuk R
Kami akan mereproduksi ramalan untuk kotak otomatis pada data Vertica menggunakan R. Agar tidak menakuti programmer yang tidak terbiasa dengan bahasa ini, saya akan melakukan kursus singkat tentang seorang pejuang muda R.
Jadi, bahasa R adalah bahasa prosedural yang sama yang memiliki objek, kelas, dan fungsi.
Objek dapat berupa kumpulan data (vektor, daftar, dataset ...), nilai (teks, angka, tanggal, waktu ...) atau fungsi. Untuk tipe nilai, numerik, string, boolean, dan tanggal-waktu didukung. Untuk dataset, penomoran array dimulai dari 1, bukan 0.
Secara klasik, alih-alih "=" dalam R, operator penugasan "<-" digunakan. Meskipun tidak dilarang untuk menggunakan tugas ke sisi lain "->" dan bahkan yang biasa "=". Operator "=" sendiri digunakan saat memanggil fungsi untuk menentukan parameter bernama.
Alih-alih "." "$" digunakan untuk mengakses bidang set data. Titik bukanlah kata kunci dan digunakan dalam nama objek untuk meningkatkan keterbacaannya. Dengan demikian, "my.data $ field" akan didekripsi sebagai array catatan dari bidang "lapangan" dari kumpulan data "my.data".
Anda dapat menggunakan tanda kutip tunggal atau ganda untuk membingkai teks.
Yang paling penting: R diarahkan untuk bekerja dengan set data. Bahkan jika kode mengatakan "a <-1", maka pastikan bahwa R di dalam dirinya percaya bahwa "a" adalah array dari 1 elemen. Desain bahasa memungkinkan Anda untuk bekerja dengan kumpulan data seperti halnya variabel biasa: tambah dan kurangi, sambungkan dan putuskan, saring dengan pengukuran. Cara termudah untuk membuat array yang mendaftarkan elemen-elemennya adalah dengan memanggil fungsi "c (elemen-elemen array yang dipisahkan oleh koma)". Nama "c" tampaknya diambil sebagai kependekan dari Collection, tetapi saya tidak akan mengatakannya dengan pasti.
Memuat data dari DBMS ke R
Untuk menggunakan RDBMS melalui ODBC untuk R, Anda harus menginstal paket RODBC. Itu dapat diinstal di R Studio pada tab paket atau menggunakan perintah R:
install.packages('RODBC') library('RODBC')
Sekarang kita bisa bekerja dengan Vertica. Kami membuat alias ODBC ke server dan mendapatkan data uji dan set data lengkap untuk mobil:
# Vertica con <- odbcConnect(dsn='VerticaDSN') # mtcars_train mtcars.train <- sqlQuery(con, "SELECT * FROM public.mtcars_train") # mtcars</b> mtcars.data <- sqlQuery(con, "SELECT * FROM public.mtcars") # odbcClose(con)
Ketika memuat data dari sumber R untuk bidang tipe teks dan tanggal-waktu, milik mereka faktor secara otomatis ditetapkan. Bidang "am" adalah tipe numerik dan R dianggap sebagai indikator numerik, dan bukan faktor, yang tidak akan memungkinkan untuk regresi logistik. Karenanya, kami mengonversi bidang ini ke faktor numerik:
mtcars.data$am = factor(mtcars.data$am) mtcars.train$am = factor(mtcars.train$am)
Di R Studio, nyaman untuk menonton data secara interaktif, membuat grafik analisis prediktif dan menulis kode dalam R dengan tips:

Membangun model dalam R
Kami akan membangun model regresi logistik di atas kumpulan data yang disiapkan untuk dimensi yang sama seperti di Vertica:
mtcars.model <- glm(formula = am ~ cyl + wt + gear, family = binomial(), data = mtcars.train)
Penjelasan: dalam bahasa R, rumus analisis prediktif ditunjukkan sebagai:
< >~< >
Analisis data model dalam R
Kami menginisialisasi set data yang dihasilkan, dengan mengambil dari mtcars semua catatan untuk bidang yang diperlukan:
mtcars.result <- data.frame(car_model = mtcars.data$car_model, am = mtcars.data$am, predict = 0)
Sekarang, berdasarkan model yang dibuat, Anda dapat melakukan analisis pada data itu sendiri:
mtcars.result$predict <- predict.glm(mtcars.model, newdata = subset(mtcars.data, select = c('cyl', 'wt', 'gear')), type = 'response' )
Hasil analisis dikembalikan ke bidang prediksi sebagai persentase dari probabilitas perkiraan. Sederhanakan dengan analogi dengan Vertica dengan nilai 0 atau 1, dengan mempertimbangkan ramalan positif dengan probabilitas lebih dari 50%:
mtcars.result$predict <- ifelse(mtcars.result$predict > 0.5, 1, 0)
Kami menghitung jumlah total rekaman yang bidang prediksi yang diprediksi tidak cocok dengan nilai sebenarnya di pagi:
nrow(mtcars[mtcars.result$am != mtcars.result$predict, ])
R mengembalikan nol. Dengan demikian, perkiraan tersebut menyatu pada semua model mobil, seperti pada ML Vertica.
Harap dicatat: rekaman dari mtcars dikembalikan oleh filter (parameter pertama dalam tanda kurung siku) dengan semua kolom (parameter kedua dihilangkan setelah koma dalam tanda kurung kotak).
Menyimpan dan memuat data secara lokal di R
Setelah keluar dari R, studio menyarankan untuk menyimpan status semua objek agar dapat terus bekerja setelah restart. Jika karena alasan tertentu Anda perlu menyimpan dan mengembalikan keadaan masing-masing objek, untuk fungsi khusus ini disediakan di R:
# save(mtcars.model, file = 'mtcars.model') # load('mtcars.model')
Menyimpan data dari R ke Vertica
Jika R Studio digunakan untuk menyiapkan data untuk pelatihan model ML Vertica, atau jika analisis dilakukan secara langsung di dalamnya, yang kemudian akan digunakan dalam database Vertica, set data R dapat ditulis ke tabel Vertica.
Karena perpustakaan ODBC untuk R dirancang untuk OLTP RDBMSs, ia tidak dapat dengan benar menghasilkan kueri pembuatan tabel untuk Vertica. Oleh karena itu, untuk berhasil merekam data, Anda harus secara manual membuat tabel yang diperlukan di Vertica menggunakan SQL, kumpulan bidang dan jenis yang bertepatan dengan set data yang dapat direkam R.
Selanjutnya, proses perekaman itu sendiri terlihat sederhana (jangan lupa untuk membuka dan kemudian menutup koneksi con):
sqlSave(con, mtcars.result, tablename = 'public.mtcars_result', append = TRUE, rownames = FALSE, colnames = FALSE)
Menggunakan Vertica dengan R
Pekerjaan interaktif dengan data dalam R Studio sangat cocok untuk mode penelitian dan persiapan data. Tapi itu benar-benar tidak cocok untuk analisis aliran data dan array besar dalam mode otomatis. Salah satu opsi untuk skema analisis prediktif hybrid R dengan Vertica adalah persiapan data untuk pembelajaran R dan mengidentifikasi dependensi untuk membangun model. Kemudian, dengan menggunakan fungsi ML yang dibangun ke dalam Vertica, model perkiraan untuk data yang disiapkan pada R dilatih dengan memperhitungkan ketergantungan variabel yang teridentifikasi.
Ada opsi yang lebih fleksibel ketika semua kekuatan bahasa R digunakan langsung dari bawah Vertica. Untuk ini, Vertica mengembangkan distribusi R dalam bentuk plug-in library yang memungkinkan Anda untuk menggunakan fungsi transformasi yang ditulis langsung dalam bahasa R. dalam pertanyaan SQL. Dokumentasi menjelaskan secara rinci pemasangan dukungan R untuk Vertica dan paket R tambahan yang diperlukan untuk operasi, jika ada.
Menyimpan Model R di Vertica
Untuk menggunakan model analisis yang sebelumnya disiapkan oleh R Studio dalam fungsi R yang berjalan di bawah Vertica, Anda harus menyimpannya di server Vertica. Menyimpan secara lokal di setiap server cluster dengan file tidak nyaman atau dapat diandalkan, server baru dapat ditambahkan ke cluster, dan ketika mengubah model Anda harus ingat untuk menulis ulang semua file lagi.
Cara yang paling mudah adalah dengan membuat serial model R menjadi teks dan menyimpan fungsi Vertica sebagai UDF, yang akan mengembalikan teks ini sebagai konstanta (jangan lupa untuk membuka dan kemudian menutup koneksi con):
# mtcars.model.text <- rawToChar( serialize(mtcars.model, connection = NULL, ascii = TRUE)) # Vertica # ( ) mtcars.func <- paste0( "CREATE OR REPLACE FUNCTION public.MtCarsAnalizeModel() RETURN varchar(65000) AS BEGIN RETURN '", gsub("'", "''", mtcars.model.text), "'; END; GRANT EXECUTE ON FUNCTION public.MtCarsAnalizeModel() TO public;" ) # Vertica sqlQuery(con, mtcars.func)
Metode yang diusulkan memungkinkan untuk menghindari pembatasan Vertica pada parameter yang ditransmisikan dalam fungsi transformasi, di mana hanya diperlukan pengalihan konstanta atau ekspresi dari konstanta. Vertica UDF SQL mengkompilasi bukan sebagai fungsi, tetapi sebagai ekspresi yang dihitung, yaitu, ketika melewati parameter, alih-alih memanggil fungsi, teksnya (dalam hal ini konstanta) akan ditransfer, yang disimpan dalam kode di atas.
Jika Anda mengubah model, Anda harus membuat ulang fungsinya di Vertica. Masuk akal untuk membungkus kode ini dalam fungsi universal yang menghasilkan fungsi di Vertica dengan nama yang ditentukan dari model yang diteruskan.
Fungsi R untuk Vertica
Untuk menghubungkan fungsi R ke Vertica, Anda perlu menulis analisis data dan fungsi pendaftaran di Vertica.
Fungsi bekerja dengan data dari bawah Vertica itu sendiri harus memiliki dua parameter: set data yang dihasilkan (seperti data.frame) dan parameter kerja (seperti daftar):
MtCarsAnalize <- function(data, parameters) { if ( is.null(parameters[['model']]) ) { stop("NULL value for model! Model cannot be NULL.") } else { model <- unserialize(charToRaw(parameters[['model']])) } names(data) <- c('car_model', 'cyl', 'wt', 'gear') result <- data.frame(car_model = data$car_model, predict = 0) result$predict <- predict.glm(model, newdata = subset(data, select = c('cyl', 'wt', 'gear')), type = 'response' ) result$predict <- ifelse(result$predict > 0.5, TRUE, FALSE) return(result) }
Dalam tubuh fungsi, diperiksa bahwa parameter model dilewatkan, teks yang diterjemahkan ke dalam bentuk biner dan deserialized ke objek model analisis. Karena Vertica mentransfer nama bidangnya sendiri ke dataset untuk fungsi tersebut, nama bidang eksplisit ditetapkan ke dataset. Berdasarkan data yang diperoleh, satu set hasil dibangun dengan nama model mesin dan prediksi nol. Selanjutnya, perkiraan dibuat hanya menggunakan bidang yang diperlukan untuk analisis dari kumpulan data yang diperoleh. Bidang prediksi set hasil diatur ke nilai Boolean (untuk perubahan dan bukan angka) dan hasilnya dikembalikan dari fungsi.
Sekarang tinggal menjelaskan pendaftaran fungsi ini di Vertica:
MtCarsAnalizeFactory <- function() { list(name = MtCarsAnalize, udxtype = c("transform"), intype = c("varchar", "int", "float", "int"), outtype = c("varchar", "boolean"), outnames = c("car_model", "predict"), parametertypecallback=MtCarsAnalizeParameters) } MtCarsAnalizeParameters <- function() { parameters <- list(datatype = c("varchar"), length = 65000, scale = c("NA"), name = c("model")) return(parameters) }
Fungsi MtCarsAnalizeFactory menjelaskan nama fungsi yang digunakan untuk operasi, bidang untuk kumpulan data yang masuk dan keluar, dan fungsi kedua menjelaskan parameter yang dikirimkan "model". Tipe bidang adalah tipe data Vertica. Saat mentransfer dan mengembalikan data, Vertica secara otomatis mengonversi nilai ke tipe data yang diperlukan untuk bahasa R. Anda dapat melihat tabel kompatibilitas jenis dalam dokumentasi Vertica.
Anda dapat menguji operasi fungsi tertulis untuk Vertica pada data yang diunggah ke R studio:
test.data = subset(mtcars.data, select = c('car_model', 'cyl', 'wt', 'gear')) test.params = list(model = mtcars.model.text) test.result = MtCarsAnalize(test.data, test.params)
Hubungkan pustaka fitur ke Vertica
Kami menyimpan semua fungsi di atas dalam satu file "mtcars_func.r" dan mengunggah file ini ke salah satu server dari cluster Vertica di "/ home / dbadmin".
Poin penting: di R Studio, Anda perlu mengatur opsi untuk menyimpan terjemahan baris dalam file dalam mode Posix (LF). Ini dapat dilakukan di opsi global, bagian Kode, tab Tabungan. Jika Anda bekerja pada Windows, secara default file akan disimpan dengan carriage return dan tidak akan dapat diunggah ke Vertica.
Kami terhubung ke server dari cluster Vertica, tempat kami menyimpan file dan memuat pustaka:
CREATE LIBRARY MtCarsLibs AS '/home/dbadmin/mtcars_func.r' LANGUAGE 'R';
Sekarang dari perpustakaan ini Anda dapat mendaftarkan fungsi R:
CREATE TRANSFORM FUNCTION public.MtCarsAnalize AS LANGUAGE 'R' NAME 'MtCarsAnalizeFactory' LIBRARY MtCarsLibs; GRANT EXECUTE ON TRANSFORM FUNCTION public.MtCarsAnalize(varchar, int, float, int) TO public;
Panggil fungsi R di Vertica
Kami memanggil fungsi R, mengirimkannya teks model, yang sebelumnya disimpan sebagai fungsi UDF:
SELECT MtCarsAnalize(car_model, cyl, wt, gear USING PARAMETERS model = public.MtCarsAnalizeModel()) OVER() FROM public.mtcars;

Dapat diverifikasi bahwa, seperti dalam kasus sebelumnya, perkiraannya adalah 100% konsisten dengan keadaan sebenarnya:
SELECT c.*, p.predict, p.predict = c.am::int AS valid FROM public.mtcars c INNER JOIN ( SELECT MtCarsAnalize(car_model, cyl, wt, gear USING PARAMETERS model = public.MtCarsAnalizeModel()) OVER() FROM public.mtcars ) p ON c.car_model = p.car_model
Harap dicatat: fungsi transformasi di Vertica mengembalikan kumpulan data mereka sendiri dari bidang dan catatan yang ditentukan dalam fungsi, namun mereka dapat digunakan dalam kueri jika dibungkus dalam subquery.
Ketika fungsi R terhubung, Vertica menyalin kode sumber ke instalasinya, yang dikompilasi ke dalam kode mesin. File sumber R yang diunggah ke server setelah terhubung ke perpustakaan tidak diperlukan untuk pekerjaan lebih lanjut. Kecepatan fungsi yang mempertimbangkan kompilasi biner cukup tinggi untuk bekerja dengan array data yang besar, namun, perlu diingat bahwa semua operasi R dilakukan dalam memori dan ada risiko akan bertukar jika ada kekurangan memori OS untuk memenuhi kebutuhan Vertica dan R yang bekerja bersama. .
Jika fungsi ini dipanggil pada partisi data yang ditentukan dalam PARTITION BY untuk OVER, maka Vertica memparalelkan eksekusi setiap partisi pada server cluster. Dengan demikian, jika pabrikan masih ada di set data selain model mesin, Anda bisa menentukannya dalam PARTISI OLEH dan memparalelkan analisis untuk setiap pabrikan.
Peluang Pembelajaran Mesin Vertica Lainnya
Selain R, Vertica dapat mengembangkan fungsi transformasi sendiri di C, Java, dan Python. Setiap bahasa memiliki nuansa dan fitur penulisan dan koneksi ke Vertica sendiri. Bersama dengan ML-nya sendiri, semua ini memberi Vertica cadangan yang baik untuk analisis data prediktif.
Terima kasih dan tautan
Saya ingin mengucapkan terima kasih kepada teman dan kolega saya Vlad Malofeev dari Perm, yang memperkenalkan saya kepada R dan membantu saya mencari tahu di salah satu proyek bersama kami.
Awalnya, dalam proyek di mana perkiraan dibuat pada kondisi sulit untuk masa depan menggunakan data dari tahun lalu, pengembang mencoba menggunakan SQL dan Java. Hal ini menyebabkan kesulitan besar dalam mempertimbangkan kualitas sumber-sumber ini dan sangat memperlambat pengembangan proyek. Vlad datang ke proyek dengan R, kami menghubungkan R ke Vertica, ia mengantarkan data ke studio dan semuanya berputar dan berbelok dengan indah segera. Secara harfiah dalam beberapa minggu, semua yang berlangsung selama berbulan-bulan disapu, menyelamatkan proyek dari kode kompleks.
Contoh data dengan mobil dapat diunduh dari repositori GIT:
git clone https://github.com/vertica/Machine-Learning-Examples
dan unggah ke Vertica:
/opt/vertica/bin/vsql -d <name of your database> -f load_ml_data.sql
Jika Anda ingin masuk lebih dalam ke ML dan belajar cara bekerja dengan R, saya sarankan buku dalam bahasa Rusia
"R in action." Analisis dan visualisasi data dalam bahasa R. β Ini ditulis dalam bahasa manusia yang sederhana dan mudah diakses dan cocok untuk pemula yang belum pernah mengalami pembelajaran mesin.
Di sini Anda dapat melihat informasi tentang menghubungkan perpustakaan R ke Vertica.
Bagi mereka yang sudah mulai belajar dan menggunakan ML dengan Python, ada baiknya memperhatikan IDE Rodeo, ini adalah analog dari R Studio, karena tanpa analisis kualitas interaktif tidak mungkin. Saya pikir semua yang dijelaskan dalam artikel ini di bawah R dengan cara yang sama dapat dikembangkan dengan Python, termasuk menyimpan model dalam fungsi UDF dan mengembangkan fungsi analisis untuk Vertica. Jika Anda memeriksa, jangan lupa untuk berhenti berlangganan tentang hasil di komentar, saya akan berterima kasih atas informasinya.
Terima kasih atas waktu Anda dan saya harap saya dapat menunjukkan kesederhanaan dan kemampuan luar biasa dari simbiosis R dan Vertica.