ML: Logistic Regression

September 15, 2022 Leave a comment

Logistic Regression (Regresi logistik) biasanya digunakan untuk menyelesaikan masalah klasifikasi. Sebagai contoh sederhana, hasil prediksi LR seperti ‘ya’ atau ‘tidak’, 0 atau 1, dst. Tidak seperti regresi linier yang memprediksi hasil berkelanjutan.

LR juga bisa digunakan untuk kasus yang memiliki lebih dari dua hasil untuk diklasifikasikan, dalam hal ini disebut multinomial. Contoh umum untuk regresi logistik multinomial akan memprediksi kelas bunga iris antara 3 spesies yang berbeda. Di sini kita menggunakan LR untuk memprediksi variabel binomial.

dalam library scikit-learn tersedia beberapa dataset yang bisa digunakan untuk latihan. Kita akan menggunakan dataset breast-cancer.

import numpy as np
import pandas as pd
import sklearn
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.datasets import load_breast_cancer
breast_cancer = load_breast_cancer()
breast_cancer

Kita export data tersebut menjadi data-frame:

df = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
df

Data tersebut di atas menjelaskan 30 kolom/fitur seperti: mean-radius, mean-texture, …, worst fractal dimension, dan kemudian data hasil/target 0 dan 1, yang menjelaskan bahwa [0] adalah kanker ganas, dan [1] kanker tidak ganas (malignant, benign).

Kita menggunakan kolom mean-radius sebagai X, dan target sebagai y:

X = df['mean radius']
y = breast_cancer.target

# plot
plt.figure(figsize=(10,8))
plt.scatter(X,y)

Dari plot tersebut terlihat ada hasil ukuran antara 10-15 yang ambigu, bisa 0 atau 1. Nah, LR digunakan untuk ini agar bisa mendapatkan garis yang jelas dimana nilai tengah yang membagi 0 dan 1.

Sekarang coba kita selesaikan dengan LR:

from sklearn.linear_model import LogisticRegression
logr = LogisticRegression()
X = np.array(X).reshape((-1, 1))
logr.fit(X,y)

# plot
from scipy.special import expit
plt.figure(figsize=(10,8))
loss = expit(X * logr.coef_ + logr.intercept_).ravel()
plt.scatter(X, loss, color="red", linewidth=1)
plt.scatter(X,y)

Tampak garis merah sebagai garis Linear Regression (LR). Sekarang kita bisa melakukan prediksi, sebagai contoh: jika mean-radius 15.5mm dan 14.5mm, apakah dia termasuk 0 (ganas) atau 1 (jinak)?

# prediksi dengan nilai
logr.predict(np.array([15.5, 14.5]).reshape(-1,1))
output: array([0, 1])

# prediksi dari data X
y_pred = logr.predict(X)

# score
logr.score(X, y)
output: 0.8787346221441125

Berdasarkan prediksi LR, maka mean-radius 14.5 masih masuk kategori jinak, dan 15.5 sudah masuk kategori ganas. Hasil prediksi juga cukup bagus (87%).

Categories: Uncategorized

ML: Multiple Regression

September 15, 2022 Leave a comment

Pembahasan sebelumnya adalah tentang regresi tunggal dimana hanya tersedia 1 fitur/variable bebas ‘X’ sehingga kita bisa memprediksi ‘y’. Multiple Regression memungkinkan lebih dari 1 fitur/variable bebas. Sehingga persamaannya menjadi:

y = b0 + b1X1 + b2X2 + .. + bnXn

Contoh berikut adalah data yang menjelaskan tentang kendaraan dan keluaran CO2. Dengan data tersebut, kita bisa memprediksi CO2 dengan kolom Volume dan Weight sebagai fitur/variabel bebas-nya.

import numpy as np
import pandas as pd
import sklearn
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.read_csv("/home/eddys/Documents/Courses/Udemy/ML/data/car.csv")
df.head()
---------
	Car 	Model 	Volume 	Weight 	CO2
0 	Toyota 	Aygo 	1000 	790 	99
1 	Mits. 	Space 	1200 	1160 	95
2 	Skoda 	Citigo 	1000 	929 	95
3 	Fiat 	500 	900 	865 	90
4 	Mini 	Cooper 	1500 	1140 	105

Berikut data X (terdiri dari Volume dan Weight), dan y (CO2)

X = df[['Volume','Weight']]
X.head()
-----
        Volume 	Weight
0 	1000 	790
1 	1200 	1160
2 	1000 	929
3 	900 	865
4 	1500 	1140

y = df[['CO2']]
y.head()
-----
 	CO2
0 	99
1 	95
2 	95
3 	90
4 	105
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
model = LinearRegression()
model.fit(X,y)

# prediksi
model.predict([[1200,1160],[1500,1140]])
output: array([[ 97.82012716], [100.01068547]])

# score
y_pred = model.predict(X)
r2_score(y, y_pred)
output: 0.3765564043619989

Prediksi sudah bisa dilakukan walau buruk (37%), sehingga perlu adanya langkah-langkah tambahan untuk memperbaiki performance.

plt.figure(figsize=(12,8))
sns.regplot(X['Volume'],y_pred)
# korelasi
df.corr()
-----
 	Volume 	        Weight 	        CO2
Volume 	1.000000 	0.753537 	0.592082
Weight 	0.753537 	1.000000 	0.552150
CO2 	0.592082 	0.552150 	1.000000

Kalau dilihat dari korelasi, maka Volume maupun Weight tidak begitu berpengaruh pada CO2.

plt.figure(figsize=(12,8))
sns.heatmap(df.corr(), annot=True)
Categories: Uncategorized

ML: Polynomial Regression

September 14, 2022 Leave a comment

Regresi tidak hanya berbentuk garis lurus. Jika polanya berbentuk kurva, maka harus diselesaikan dengan polynomial regression. Sebagai contoh, dibawah ini adalah data dengan pola kurva dimana saya men-generate dengan persamaan garis: y = X3 + 70 (dengan pangkat, akan membentuk kurva).

import numpy as np
import pandas as pd
import sklearn
import seaborn as sns
import matplotlib.pyplot as plt

np.random.seed(42)
X=np.random.randint(100, size=(100))
y = X**3 + 70

plt.figure(figsize=(10,8))
plt.scatter(X,y)

Saya tambahkan random error supaya titik tidak berada dalam sebuah garis:

np.random.seed(42)
n_samp = 100
X=np.linspace(0, 10, 100)
e = np.random.randn(n_samp) * 100
y = X**3 + 70 + e

plt.figure(figsize=(10,8))
plt.scatter(X,y)

Jika kita selesaikan dengan Linear Regresssion, maka hasilnya sebagai berikut:

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

lr = LinearRegression()
lr.fit(X.reshape(-1,1),y)
model = lr.predict(X.reshape(-1,1))
plt.figure(figsize=(10,8))
plt.scatter(X,y)
plt.plot(X, model)
r2_score(y, model)
output: 0.7643394574930142

Jika diselesaikan dengan Polynomial Regression, maka hasilnya menjadi lebih akurat:

from sklearn.preprocessing import PolynomialFeatures
poly_reg = PolynomialFeatures()
X_poly = poly_reg.fit_transform(X.reshape(-1, 1))

X_poly
array([[1.00000000e+00, 0.00000000e+00, 0.00000000e+00],
       [1.00000000e+00, 1.01010101e-01, 1.02030405e-02],
       [1.00000000e+00, 2.02020202e-01, 4.08121620e-02],
       [1.00000000e+00, 3.03030303e-01, 9.18273646e-02],
       [1.00000000e+00, 4.04040404e-01, 1.63248648e-01],
       [1.00000000e+00, 5.05050505e-01, 2.55076013e-01], ...
lin_reg2 = LinearRegression()
lin_reg2.fit(X_poly, y.reshape(-1, 1))
y_pred = lin_reg2.predict(X_poly)

y_pred
array([[ 113.30741637],
       [ 106.83663634],
       [ 100.68690567],
       [  94.85822435],
       [  89.35059237],
       [  84.16400974], ...
plt.figure(figsize=(10,8))
plt.scatter(X,y)
plt.plot(X, y_pred)
r2_score(y, y_pred)
output: 0.9173858308909386

# prediksi
lin_reg2.predict(np.array([[1.00000000e+00, 5.05050505e-01, 2.55076013e-01],[1,5,7]]))
output: array([[  84.16400975],
       [-104.81100298]])
Categories: Python

ML: Linear Regression 2

September 13, 2022 Leave a comment

Pembahasan sebelumnya kita mempunyai data yang begitu sempurna sehingga deretan titiknya berada dalam sebuah garis, sehingga polanya dengan mudah didapatkan dengan perhitungan sederhana. Namun pada kenyataannya, data dari hasil penelitian biasanya lebih tersebar dari garis nya. Sebagai contoh dibawah ini adalah data dengan distribusi error.

Saya men-generate nya dengan rumus yang sama dengan sebelumnya, y = 4 + 2X + e, dimana e adalah error secara random supaya titik tidak dalam garis.

np.random.seed(42)
n_samp = 100
X=np.linspace(0, 10, 100)
e = np.random.randn(n_samp) * 1.2
y = X*2 + 4 + e

plt.figure(figsize=(10,8))
plt.scatter(X,y)

Gambar di atas adalah hasil plot. Dengan begitu, perhitungan untuk mendapatkan model atau persamaan garis dan prediksi secara manual akan semakin sulit dibanding sebelumnya (dimana data dalam sebuah garis).

Namun, dengan cara yang sama kita akan mudah mendapatkannya dengan program:

# import modul
from sklearn.linear_model import LinearRegression
model = LinearRegression()
X = X.reshape(-1,1)
model.fit(X,y)

# result
model.coef_
output: 2.01655192

model.intercept_
output: 3.7926245751071477

# prediksi
model.predict(np.array([6,7,15]).reshape(-1,1))
output: array([15.8919361 , 17.90848802, 34.04090339])

# score
from sklearn.metrics import r2_score
y_pred = model.predict(X).reshape(-1,1)
r2_score(y, y_pred)
output: 0.9671716445291999

# plot
plt.figure(figsize=(12,8))
sns.regplot(X,y)

Persamaan garis: y = 3.7926245751071477 + 2.01655192X

Categories: Python

ML: Linear Regression 1

September 13, 2022 Leave a comment

Sebelum menjelajah Machine Learning (ML) secara mendalam, ada baiknya mengerti secara dasar. Secara umum, ML memungkinkan mesin/komputer dapat menghasilkan sebuah algoritma/rumus sehingga si mesin bisa menebak atau memprediksi. Sebagai contoh, di bawah ada urutan angka:

4, 6, 8, 10, 12

kalau kita dengan mudah menebak angka berikutnya (*karena kita manusia, dan polanya mudah dikenali). Angka berikutnya pasti: 14, 16, dst. Tapi bagaimana komputer bisa melakukan juga? Nah ini adalah konsep awal ML.

Langkah pertama, adalah memetakan seperti kita membuat sebuah grafik Xy. Kita memerlukan sebuah variabel X.

y = 4, 6, 8, 10, 12
X = 0, 1, 2, 3, 4

Langkah kedua, menggambar titik-titiknya, dan kemudian mencari garis lurus yang melewatinya. Langkah ketiga, mencari rumus garis tersebut (dengan aljabar linier). Rumus tersebut akan didapatkan:

y = 4 + 2X

dengan rumus tersebut, kita bisa memprediksi X ke 6, 7, 8, dst. Sebagai contoh, X[6] = 16.

Sekarang kita lakukan pada komputer dengan menggunakan python.

# import beberapa modul yang dibutuhkan
import numpy as np
import pandas as pd
import sklearn
import seaborn as snsimport matplotlib.pyplot as plt
# definisikan array
X = np.array([0,1,2,3,4])
y = np.array([4,6,8,10,12])
# plot
plt.figure(figsize=(10,8))
plt.scatter(X,y)
# import Linear Regression
from sklearn.linear_model import LinearRegression
model = LinearRegression()

# mencari model/rumus
X = X.reshape(-1,1)
model.fit(X,y)

# result
model.coef_
output: 2

model.intercept_
output: 4

# plot
plt.figure(figsize=(12,8))
sns.regplot(X,y)
# prediksi angka ke 6, 7, 8, 9:
model.predict(np.array([6,7,8,9]).reshape(-1,1))
output: array([16., 18., 20., 22.])
Categories: Python

Fedora: Fresh Installation

September 8, 2022 Leave a comment

Sebagai catatan setelah melakukan fresh installation, beberapa langkah untuk melengkapi:

//install repositories
# dnf install -y \
  https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
# dnf install -y \
  https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

//install important package
# dnf update -y
# dnf install -y gedit
# chkconfig httpd on
# service httpd start
# dnf install -y mariadb mariadb-server
# chkconfig mariadb on
# service mariadb start
# dnf install -y php php-mysqlnd
# dnf install -y cronie

//install additional packages
# dnf install -y ffmpeg
# dnf install -y vlc
# dnf install -y openshot
# dnf install -y pip
# dnf install -y file-roller
# dnf install -y thonny


//example crond
# crontab -e
7 16 * * 1-6 /home/user/dumps/buscript1.sh
48 8-21 * * 1-6 /home/user/dumps/buscript2.sh

//prepare homedir
$ mkdir public_html
$ chmod a+x public_html
$ chmod a+x .
# setsebool -P httpd_enable_homedirs 1
//edit /etc/httpd.conf (modify homedir section, remarks #)

//example create & grant mariadb/mysql
> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'supermen';
> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%';
> CREATE USER 'user'@'localhost' IDENTIFIED BY 'betmen';
> GRANT SELECT, INSERT, DELETE, UPDATE ON *.* TO 'user'@'localhost';


//anydesk
# cat > /etc/yum.repos.d/AnyDesk-Fedora.repo << "EOF" 
[anydesk]
name=AnyDesk Fedora - stable
baseurl=http://rpm.anydesk.com/fedora/$basearch/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://keys.anydesk.com/repos/RPM-GPG-KEY
EOF

# dnf install anydesk https://rpmfind.net/linux/opensuse/distribution/leap/15.2/repo/oss/x86_64/libgtkglext-x11-1_0-0-1.2.0git20110529-lp152.3.6.x86_64.rpm 

# wget https://dev.mysql.com/get/mysql80-community-release-fc35-1.noarch.rpm
# rpm -ivh mysql80-community-release-fc35-1.noarch.rpm
# dnf install mysql-workbench

dicatat ketika install fedora 36.

Categories: Linux

Python: Installing Jupyter

August 31, 2022 Leave a comment

Python adalah bahasa pemrograman yang sangat populer hari ini. Salah satu tools yang sangat membantu adalah Jupyter dimana kita bisa langsung menulis dan menjalankan dalam versi web. Sebelum menggunakannya, kita cukup menginstall dengan cara yang sangat simple:

$ pip3 install jupyterlab --user
$ jupyter serverextension enable --py jupyterlab
$ jupyter-lab

Setelah itu, kita tinggal menjalankan dengan browser: http://localhost:8888

Categories: Python

R: sqldf

August 24, 2022 Leave a comment

Untuk bekerja selayaknya fungsi SQL di R, salah satu packages yang powerful adalah sqldf. Untuk menggunakannya kita hanya perlu install package sqldf dan meng-load nya.

Setelah itu kita tinggal melakukan query pada dataframe yang telah kita sediakan. Sebagai contoh:

df <- read.csv("~/Downloads/Indonesia-Covid.csv")
ds1 <- df[0:10]
ds2 <- df[11:12]
ds3 <- sqldf("SELECT * from ds1 INNER JOIN ds2 WHERE ds1.Date=ds2.Date1")
write.csv(ds3,"/home/eddys/result/result.csv", row.names = FALSE)

Selamat mencoba.

Categories: R

Repair Disk fsck, e2fsck

July 22, 2022 Leave a comment

Sebuah pengalaman, sedang bekerja di workstation tiba-tiba lampu padam. Itu membuat workstation tidak dapat meneruskan proses booting dengan tampilan sebagai berikut:

Beberapa cara yang saya lakukan adalah sebagai berikut:

!-- Booting menggunakan USB-fedora-live, dan open terminal
# fdisk -l (untuk list device)
# fsck /dev/sda1 (untuk repair sda1)
# fsck.extfs /dev/sda1 (untuk repair dengan filesystem extfs)
# fsck.ext2 /dev/sda1 (untuk repair dengan filesystem ext2)
# fsck.ext3 /dev/sda1 (untuk repair dengan filesystem ext3)
# fsck.ext4 /dev/sda1 (untuk repair dengan filesystem ext4)
# e2fsck /dev/sda1 (repair superblock)

# btrfs check /dev/sda1 (untuk check dengan filesystem btrfs)
# btrfs check --repair /dev/sda1 (untuk repair dengan filesystem btrfs)

kebetulan Fedora 36 menggunakan filesystem btrfs, jadi saya menggunakan btfrs.

Akhirnya workstation dapat booting dengan normal.

Categories: Linux

org.json

March 5, 2022 Leave a comment

Salah satu java library untuk parsing JSON adalah org.json. Penggunaannya adalah sebagai berikut:

import org.json.JSONObject;
import org.json.JSONArray;
import org.json.JSONTokener;

String strJSON = "
{"error_code":0,"error_desc":"","data":[
{"nama_mahasiswa":"IRMAYANTI","jenis_kelamin":"P","tanggal_lahir":"1975-11-11T17:00:00.000Z"},
{"nama_mahasiswa":"FAUZIYAH","jenis_kelamin":"P","tanggal_lahir":"1975-12-20T17:00:00.000Z"}]}
";
    
JSONTokener tokener = new JSONTokener(strJSON);
JSONObject object = new JSONObject(tokener);
System.out.println(object.getInt("error_code"));
System.out.println(object.getString("error_desc"));
JSONArray data = object.getJSONArray("data");
for (int i = 0; i < data.length(); i++) {
  nama_mahasiswa  = (data.getJSONObject(i).getString("nama_mahasiswa"));
  System.out.println(nama_mahasiswa);
}

String strJSON = "
{"error_code":0,"error_desc":"","data":{
"token":"1a513fbb-34db-49c3-a7f4-b0d6b4383877"}}
";
        
JSONTokener tokener = new JSONTokener(strToken);
JSONObject object = new JSONObject(tokener);   System.out.println(object.getJSONObject("data").getString("token"));
Categories: java