Skip to content

Instantly share code, notes, and snippets.

@ahhzaky
Created December 29, 2020 06:36
svm-tutorial-1.ipynb
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "svm-tutorial-1.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyPV0wg1Ydjw+9o+2mSwoF+I",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/ahhzaky/797c2187a38b98a7e8736d42c4b01bc1/svm-tutorial-1.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "plqnZRQMCcbV"
},
"source": [
"# Support Vector Machines\n",
"\n",
"Support Vector Machines disebut sebagai pendekatan klasifikasi, tetapi dapat digunakan di kedua jenis masalah klasifikasi dan regresi. Ini dapat dengan mudah menangani beberapa variabel kontinu dan kategorikal. SVM membangun bidang hiper dalam ruang multidimensi untuk memisahkan kelas yang berbeda. SVM menghasilkan hyperplane optimal secara berulang, yang digunakan untuk meminimalkan kesalahan. Ide inti dari SVM adalah menemukan hyperplane marginal maksimum (MMH) yang paling baik membagi dataset menjadi beberapa kelas.\n",
"\n",
"* Support Vector adalah titik data, yang paling dekat dengan bidang-hiper. Titik-titik ini akan menentukan garis pemisah dengan lebih baik dengan menghitung margin. Poin-poin ini lebih relevan dengan konstruksi pengklasifikasi.\n",
"\n",
"* Hyperplane adalah bidang keputusan yang memisahkan antara sekumpulan objek yang memiliki keanggotaan kelas yang berbeda.\n",
"\n",
"* Margin\n",
"Margin adalah celah antara dua garis pada poin kelas terdekat. Ini dihitung sebagai jarak tegak lurus dari garis untuk mendukung vektor atau titik terdekat. Jika margin lebih besar di antara kelas, maka itu dianggap sebagai margin yang baik, margin yang lebih kecil adalah margin yang buruk."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eckGcbAQDNIH"
},
"source": [
"# Bagaimana cara kerja SVM?\n",
"\n",
"Tujuan utamanya adalah untuk memisahkan kumpulan data yang diberikan dengan cara sebaik mungkin. Jarak antara salah satu titik terdekat dikenal sebagai margin. Tujuannya adalah untuk memilih hyperplane dengan kemungkinan margin maksimum antara vektor dukungan dalam dataset yang diberikan. SVM mencari hyperplane marginal maksimum dalam langkah-langkah berikut:\n",
"\n",
"* Hasilkan hyperplanes yang memisahkan kelas dengan cara terbaik. Gambar di sisi kiri menunjukkan tiga hyperplanes hitam, biru dan oranye. Di sini, biru dan oranye memiliki kesalahan klasifikasi yang lebih tinggi, tetapi hitam memisahkan kedua kelas dengan benar.\n",
"\n",
"* Pilih bidang-hiper kanan dengan segregasi maksimum dari salah satu titik data terdekat seperti yang ditunjukkan pada gambar sebelah kanan."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BApkP2-bDjc4"
},
"source": [
"### Berurusan dengan bidang non-linier dan tidak terpisahkan\n",
"Beberapa masalah tidak dapat diselesaikan dengan menggunakan hyperplane linier, seperti yang ditunjukkan pada gambar di bawah ini (sisi kiri).\n",
"\n",
"Dalam situasi seperti itu, SVM menggunakan trik kernel untuk mengubah ruang masukan ke ruang dimensi yang lebih tinggi seperti yang ditunjukkan di sebelah kanan. Titik data diplot pada sumbu x dan sumbu z (Z adalah jumlah kuadrat dari x dan y: z = x ^ 2 = y ^ 2). Sekarang Anda dapat dengan mudah memisahkan titik-titik ini menggunakan pemisahan linier.\n",
"\n",
"![image](https://user-images.githubusercontent.com/50357969/100458111-cf6bc780-30f5-11eb-86e8-2438626ceec1.png)\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "7vMPLtrdEWhe",
"outputId": "afd7abc4-c23d-401c-faec-10bac867aebb"
},
"source": [
"#Import scikit-learn dataset library\n",
"from sklearn import datasets\n",
"\n",
"#Load dataset\n",
"cancer = datasets.load_breast_cancer()\n",
"\n",
"# print the names of the 13 features\n",
"print(\"Features: \", cancer.feature_names)\n",
"\n",
"# print the label type of cancer('malignant' 'benign')\n",
"print(\"Labels: \", cancer.target_names)\n"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Features: ['mean radius' 'mean texture' 'mean perimeter' 'mean area'\n",
" 'mean smoothness' 'mean compactness' 'mean concavity'\n",
" 'mean concave points' 'mean symmetry' 'mean fractal dimension'\n",
" 'radius error' 'texture error' 'perimeter error' 'area error'\n",
" 'smoothness error' 'compactness error' 'concavity error'\n",
" 'concave points error' 'symmetry error' 'fractal dimension error'\n",
" 'worst radius' 'worst texture' 'worst perimeter' 'worst area'\n",
" 'worst smoothness' 'worst compactness' 'worst concavity'\n",
" 'worst concave points' 'worst symmetry' 'worst fractal dimension']\n",
"Labels: ['malignant' 'benign']\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "fDne7CxTEwn5",
"outputId": "f156e43b-d0cf-419e-ae54-ea81bb941d68"
},
"source": [
"# print data(feature)shape jumlah row dan colum\n",
"cancer.data.shape"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(569, 30)"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "IeS2m8S_E8YE",
"outputId": "a1202e66-f1f7-4f6b-e98f-496745f5f2f7"
},
"source": [
"# print the cancer data features 5 data teratas\n",
"print(cancer.data[0:5])"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[[1.799e+01 1.038e+01 1.228e+02 1.001e+03 1.184e-01 2.776e-01 3.001e-01\n",
" 1.471e-01 2.419e-01 7.871e-02 1.095e+00 9.053e-01 8.589e+00 1.534e+02\n",
" 6.399e-03 4.904e-02 5.373e-02 1.587e-02 3.003e-02 6.193e-03 2.538e+01\n",
" 1.733e+01 1.846e+02 2.019e+03 1.622e-01 6.656e-01 7.119e-01 2.654e-01\n",
" 4.601e-01 1.189e-01]\n",
" [2.057e+01 1.777e+01 1.329e+02 1.326e+03 8.474e-02 7.864e-02 8.690e-02\n",
" 7.017e-02 1.812e-01 5.667e-02 5.435e-01 7.339e-01 3.398e+00 7.408e+01\n",
" 5.225e-03 1.308e-02 1.860e-02 1.340e-02 1.389e-02 3.532e-03 2.499e+01\n",
" 2.341e+01 1.588e+02 1.956e+03 1.238e-01 1.866e-01 2.416e-01 1.860e-01\n",
" 2.750e-01 8.902e-02]\n",
" [1.969e+01 2.125e+01 1.300e+02 1.203e+03 1.096e-01 1.599e-01 1.974e-01\n",
" 1.279e-01 2.069e-01 5.999e-02 7.456e-01 7.869e-01 4.585e+00 9.403e+01\n",
" 6.150e-03 4.006e-02 3.832e-02 2.058e-02 2.250e-02 4.571e-03 2.357e+01\n",
" 2.553e+01 1.525e+02 1.709e+03 1.444e-01 4.245e-01 4.504e-01 2.430e-01\n",
" 3.613e-01 8.758e-02]\n",
" [1.142e+01 2.038e+01 7.758e+01 3.861e+02 1.425e-01 2.839e-01 2.414e-01\n",
" 1.052e-01 2.597e-01 9.744e-02 4.956e-01 1.156e+00 3.445e+00 2.723e+01\n",
" 9.110e-03 7.458e-02 5.661e-02 1.867e-02 5.963e-02 9.208e-03 1.491e+01\n",
" 2.650e+01 9.887e+01 5.677e+02 2.098e-01 8.663e-01 6.869e-01 2.575e-01\n",
" 6.638e-01 1.730e-01]\n",
" [2.029e+01 1.434e+01 1.351e+02 1.297e+03 1.003e-01 1.328e-01 1.980e-01\n",
" 1.043e-01 1.809e-01 5.883e-02 7.572e-01 7.813e-01 5.438e+00 9.444e+01\n",
" 1.149e-02 2.461e-02 5.688e-02 1.885e-02 1.756e-02 5.115e-03 2.254e+01\n",
" 1.667e+01 1.522e+02 1.575e+03 1.374e-01 2.050e-01 4.000e-01 1.625e-01\n",
" 2.364e-01 7.678e-02]]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "C8c7WebQFDIP",
"outputId": "57e13fd3-4dfb-4db2-ecdc-99d1d8b7d4e8"
},
"source": [
"# print the cancer labels (0:malignant, 1:benign)\n",
"print(cancer.target)"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n",
" 1 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0\n",
" 1 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0 1 1\n",
" 1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 1 1 1 0 1\n",
" 1 1 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 1 0 1 1 0 0 0 1 0\n",
" 1 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 1\n",
" 1 0 1 1 1 1 1 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 0 0 0\n",
" 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1\n",
" 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 0 0 0 1 1\n",
" 1 1 0 1 0 1 0 1 1 1 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 0 0 1 0 0\n",
" 0 1 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1\n",
" 1 0 1 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 0 1 1 1 1 1 0 1 1\n",
" 0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1\n",
" 1 1 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1 0 0 1 0 1 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0\n",
" 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n",
" 1 1 1 1 1 1 1 0 0 0 0 0 0 1]\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "YuQspKA3FKgt"
},
"source": [
"### Memisahkan Data\n",
"Untuk memahami performa model, membagi set data menjadi set pelatihan dan set pengujian adalah strategi yang baik.\n",
"\n",
"Pisahkan kumpulan data dengan menggunakan fungsi train_test_split(). Anda harus meneruskan 3 fitur parameter, target, dan ukuran test_set. Selain itu, Anda dapat menggunakan random_state untuk memilih record secara acak."
]
},
{
"cell_type": "code",
"metadata": {
"id": "j-Rn_VO-FPhq"
},
"source": [
"# Import train_test_split function\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"# Split dataset into training set and test set\n",
"X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size=0.3,random_state=109) # 70% training and 30% test"
],
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "qOJtOD40FUvc"
},
"source": [
"### Model Pembangkit\n",
"Mari membangun model mesin vektor dukungan. Pertama, impor modul SVM dan buat objek pengklasifikasi vektor dukungan dengan meneruskan kernel argumen sebagai kernel linier dalam SVC()fungsi.\n",
"\n",
"Kemudian, paskan model Anda pada set kereta menggunakan fit()dan lakukan prediksi pada set pengujian menggunakan predict()."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "G9Ao3yiTFbaD",
"outputId": "afaf41e8-1086-43ac-aa96-8473ebaba011"
},
"source": [
"#Import svm model\n",
"from sklearn import svm\n",
"\n",
"#Create a svm Classifier\n",
"clf = svm.SVC(kernel='linear') # Linear Kernel\n",
"\n",
"#Train the model using the training sets\n",
"clf.fit(X_train, y_train)\n",
"\n",
"#Predict the response for test dataset\n",
"y_pred = clf.predict(X_test)\n",
"y_pred"
],
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1,\n",
" 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1,\n",
" 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0,\n",
" 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,\n",
" 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1,\n",
" 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0,\n",
" 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1,\n",
" 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1])"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "L0IDXNKKFl0N"
},
"source": [
"### Mengevaluasi Model\n",
"Mari kita perkirakan seberapa akurat pengklasifikasi atau model dapat memprediksi kanker payudara pasien.\n",
"\n",
"Akurasi dapat dihitung dengan membandingkan nilai set pengujian aktual dan nilai prediksi."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QRzxGDrAFupm",
"outputId": "0afaff06-6095-4fde-e4d6-cfe4dd40b000"
},
"source": [
"#Import scikit-learn metrics module for accuracy calculation\n",
"from sklearn import metrics\n",
"\n",
"# Model Accuracy: how often is the classifier correct?\n",
"print(\"Accuracy:\",metrics.accuracy_score(y_test, y_pred))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Accuracy: 0.9649122807017544\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "g1aWsGo8F-91"
},
"source": [
"didapat tingkat klasifikasi 96,49%, dianggap sebagai akurasi yang sangat baik.\n",
"\n",
"Untuk evaluasi lebih lanjut, Anda juga dapat memeriksa presisi dan penarikan model."
]
},
{
"cell_type": "code",
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "oQJu_fxUGFKu",
"outputId": "442c7252-2490-4115-8128-f71354935329"
},
"source": [
"# Model Precision: what percentage of positive tuples are labeled as such?\n",
"print(\"Precision:\",metrics.precision_score(y_test, y_pred))\n",
"\n",
"# Model Recall: what percentage of positive tuples are labelled as such?\n",
"print(\"Recall:\",metrics.recall_score(y_test, y_pred))"
],
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"text": [
"Precision: 0.9811320754716981\n",
"Recall: 0.9629629629629629\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "5flDMCgpGJcz"
},
"source": [
"maka akan mendapat presisi 98% dan perolehan 96%, yang dianggap sebagai nilai yang sangat baik."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z2_cb9BLGedC"
},
"source": [
"# Menyetel Hyperparameter\n",
"* Kernel : Fungsi utama kernel adalah untuk mengubah data masukan set data yang diberikan ke dalam bentuk yang diperlukan. Ada berbagai macam fungsi seperti fungsi basis linier, polinomial, dan basis radial (RBF). Polinomial dan RBF berguna untuk bidang-hiper non-linier. Kernel polinomial dan RBF menghitung garis pemisah dalam dimensi yang lebih tinggi. Dalam beberapa aplikasi, disarankan untuk menggunakan kernel yang lebih kompleks untuk memisahkan kelas yang melengkung atau nonlinier. Transformasi ini dapat menghasilkan pengklasifikasi yang lebih akurat.\n",
"\n",
"* Regularisasi : Parameter regulasi dalam parameter Scikit-learn C python digunakan untuk mempertahankan regularisasi. Di sini C adalah parameter penalti, yang merepresentasikan kesalahan klasifikasi atau istilah kesalahan. Kesalahan klasifikasi atau istilah kesalahan memberi tahu pengoptimalan SVM berapa banyak kesalahan yang dapat ditanggung. Ini adalah bagaimana Anda dapat mengontrol trade-off antara batas keputusan dan istilah kesalahan klasifikasi. Nilai C yang lebih kecil menciptakan bidang-hiper margin kecil dan nilai C yang lebih besar menghasilkan bidang-hiper margin yang lebih besar.\n",
"\n",
"* Gamma : Nilai Gamma yang lebih rendah akan longgar sesuai dengan set data pelatihan, sedangkan nilai gamma yang lebih tinggi akan benar-benar sesuai dengan set data pelatihan, yang menyebabkan over-fitting. Dengan kata lain, Anda dapat mengatakan bahwa nilai gamma yang rendah hanya memperhitungkan titik terdekat dalam menghitung garis pemisah, sedangkan nilai gamma mempertimbangkan semua titik data dalam perhitungan garis pemisah."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sgw-orDlGSB2"
},
"source": [
"# Keuntungan\n",
"Pengklasifikasi SVM menawarkan akurasi yang baik dan melakukan prediksi yang lebih cepat dibandingkan dengan algoritma Naïve Bayes. Mereka juga menggunakan lebih sedikit memori karena mereka menggunakan subset poin pelatihan dalam fase keputusan. SVM bekerja dengan baik dengan batas pemisah yang jelas dan dengan ruang berdimensi tinggi.\n",
"\n",
"# Kekurangan\n",
"SVM tidak cocok untuk kumpulan data besar karena waktu pelatihannya yang tinggi dan juga membutuhkan lebih banyak waktu dalam pelatihan dibandingkan dengan Naïve Bayes. Ini berfungsi buruk dengan kelas yang tumpang tindih dan juga sensitif terhadap jenis kernel yang digunakan."
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment