from google.colab import drive
drive.mount('/content/drive')Mounted at /content/drive
Kismis sebagai produk makanan khas Turki, memiliki peran penting dalam produksi kismis global. Penilaian kualitas kismis saat ini memerlukan waktu dan dapat tidak konsisten. Penelitian ini bertujuan untuk memanfaatkan ekstraksi fitur morfologis dari dataset kismis untuk mengembangkan model Logistic Regression (LR) yang dapat mengklasifikasikan varietas Kecimen dan Besni.
Analisis Biaya-Manfaat * Biaya proyek: Terbatas pada upaya manusia, pelatihan, dan pemeliharaan. * Manfaat bisnis: Diukur dari potensi peningkatan efisiensi produksi, evaluasi kualitas raisin, dan potensi penggunaan model pada produk serupa.
from google.colab import drive
drive.mount('/content/drive')Mounted at /content/drive
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np# Baca dataset ke dalam DataFrame
data = pd.read_excel('/content/drive/MyDrive/psd/raisin/Raisin_Dataset.xlsx')Raisin dataset diperoleh dari hasil Computer Vision System (CVS) dari gambar varietas kismis Kecimen dan Besni yang tumbuh di Turki. Sebanyak 900 butir kismis digunakan, dimana terdapat 450 butir dari setiap varietas tersebut. Gambar-gambar ini telah menjalani berbagai tahap pra-pemrosesan dan ekstraksi fitur yang menghasilkan 7 fitur morfologi.
# Loop melalui setiap kolom dan membuat histogram untuk kolom numerik
for column in data.columns:
if data[column].dtype != 'O': # Filter kolom numerik
plt.subplot(2, 2, 1) # Ganti angka ini sesuai kebutuhan
plt.hist(data[column], bins=20, edgecolor='black')
plt.title(f'Histogram of {column}')
plt.tight_layout()
plt.show()
print("")
data.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Area 900 non-null int64
1 MajorAxisLength 900 non-null float64
2 MinorAxisLength 900 non-null float64
3 Eccentricity 900 non-null float64
4 ConvexArea 900 non-null int64
5 Extent 900 non-null float64
6 Perimeter 900 non-null float64
7 Class 900 non-null object
dtypes: float64(5), int64(2), object(1)
memory usage: 56.4+ KB
# Mengecek missing value pada suatu kolom
koloms = ['Area','MajorAxisLength','MinorAxisLength','Eccentricity','ConvexArea','Extent','Perimeter']
for kolom in koloms:
if data[kolom].isnull().any():
print(f'Terdapat missing value pada kolom {kolom}')
# Menampilkan baris yang memiliki missing value
baris_missing = data[data[kolom].isnull()].index
print(f'Baris yang memiliki missing value: {baris_missing}')
else:
print(f'Tidak terdapat missing value pada kolom {kolom}')Tidak terdapat missing value pada kolom Area
Tidak terdapat missing value pada kolom MajorAxisLength
Tidak terdapat missing value pada kolom MinorAxisLength
Tidak terdapat missing value pada kolom Eccentricity
Tidak terdapat missing value pada kolom ConvexArea
Tidak terdapat missing value pada kolom Extent
Tidak terdapat missing value pada kolom Perimeter
# Loop melalui setiap kolom dan membuat box plot untuk kolom numerik
for column in data.columns:
if data[column].dtype != 'O': # Filter kolom numerik
plt.subplot(2, 2, 1) # Ganti angka ini sesuai kebutuhan
sns.boxplot(x=data[column])
plt.title(f'Boxplot of {column}')
plt.tight_layout()
plt.show()import pandas as pd
import numpy as np
from scipy.stats import zscore
# Menentukan kolom yang akan diperiksa
columns_to_check = ['Area', 'MajorAxisLength', 'MinorAxisLength', 'Eccentricity', 'ConvexArea', 'Extent', 'Perimeter']
# Menghitung Z-Scores hanya untuk kolom-kolom yang diinginkan
z_scores = zscore(data[columns_to_check])
# Menentukan threshold Z-Score (misalnya, 3)
threshold = 3
# Mendeteksi outlier
outliers = (np.abs(z_scores) > threshold).any(axis=1)
# Menampilkan informasi tentang outlier
outlier_info = {
'values': data[outliers].values.tolist(),
'indices': data[outliers].index.tolist(),
'total': sum(outliers)
}
print(f"Outliers:")
print(f"Indices: {outlier_info['indices']}")
print(f"Values: {outlier_info['values']}")
print(f"Total outliers: {outlier_info['total']}")Outliers:
Indices: [13, 23, 34, 43, 85, 106, 156, 192, 197, 235, 251, 253, 290, 316, 356, 459, 483, 487, 490, 498, 506, 507, 536, 552, 579, 580, 581, 616, 668, 682, 694, 708, 769, 802, 804, 812, 829, 836, 866, 880]
Values: [[76792, 338.8575454, 291.3592017, 0.510583813, 78842, 0.772322237, 1042.77, 'Kecimen'], [61251, 301.5077895, 273.6599414, 0.419753707, 64732, 0.643595671, 971.769, 'Kecimen'], [46427, 253.8420284, 235.9068241, 0.369212459, 48275, 0.684219059, 844.312, 'Kecimen'], [92384, 368.4062138, 320.7145792, 0.492086934, 93772, 0.749006827, 1135.662, 'Kecimen'], [180898, 843.9566534, 323.1905688, 0.923770364, 221396, 0.454188929, 2253.557, 'Kecimen'], [48945, 269.3704112, 239.1621656, 0.460121209, 51456, 0.711244478, 872.289, 'Kecimen'], [45962, 251.1333844, 235.3680757, 0.348729642, 47173, 0.742280362, 810.195, 'Kecimen'], [37569, 232.4278475, 208.1520065, 0.44495009, 38874, 0.794371379, 734.102, 'Kecimen'], [86545, 350.1278744, 315.7195205, 0.432307345, 87512, 0.785886818, 1070.062, 'Kecimen'], [39716, 243.0382802, 210.1140569, 0.502579995, 40598, 0.779432833, 737.468, 'Kecimen'], [45598, 259.8962651, 225.6562198, 0.496118267, 47266, 0.741286253, 813.276, 'Kecimen'], [39439, 246.7636115, 212.635393, 0.507423663, 42795, 0.646827284, 793.005, 'Kecimen'], [136340, 722.8539172, 311.3413551, 0.902489762, 176818, 0.529774048, 2098.263, 'Kecimen'], [55746, 280.3131243, 254.6003304, 0.418381972, 56989, 0.730654294, 875.659, 'Kecimen'], [58460, 290.7535562, 258.3843539, 0.458544698, 60254, 0.774756149, 908.357, 'Kecimen'], [83107, 507.3808994, 233.1538498, 0.8881652, 93706, 0.491002009, 1367.331, 'Besni'], [92188, 374.7201638, 324.3025616, 0.500990716, 95920, 0.747599585, 1190.813, 'Besni'], [210923, 984.0454912, 367.2795321, 0.927737116, 278217, 0.507352075, 2697.753, 'Besni'], [171256, 531.3732054, 412.3828168, 0.630646744, 174277, 0.70191488, 1559.214, 'Besni'], [116406, 612.665318, 251.8328267, 0.911615194, 125638, 0.526259635, 1480.951, 'Besni'], [182160, 997.2919406, 271.8723954, 0.96212444, 221527, 0.379856115, 2303.69, 'Besni'], [208264, 675.0983445, 395.5792906, 0.810341407, 212813, 0.771748314, 1755.167, 'Besni'], [81604, 528.5858925, 204.7395131, 0.921939284, 87172, 0.491460095, 1299.386, 'Besni'], [204864, 596.6398018, 440.4971275, 0.674476207, 209457, 0.751009036, 1726.246, 'Besni'], [130868, 613.1726145, 273.1819147, 0.895270971, 134139, 0.536784249, 1513.352, 'Besni'], [206720, 713.4725493, 373.6425439, 0.851905369, 210114, 0.780576219, 1866.091, 'Besni'], [205497, 632.7276067, 414.1883255, 0.755968807, 209486, 0.76928865, 1736.839, 'Besni'], [199015, 615.4172359, 413.9274732, 0.740009433, 201464, 0.768569796, 1687.866, 'Besni'], [206689, 746.145341, 355.3006855, 0.879346962, 212569, 0.745808887, 1876.028, 'Besni'], [106923, 591.1158376, 234.8233464, 0.917708543, 111428, 0.522278775, 1425.109, 'Besni'], [172783, 820.724022, 352.1936798, 0.903244833, 219952, 0.496936979, 2289.889, 'Besni'], [222915, 731.5594062, 389.9466998, 0.84609325, 227170, 0.770542973, 1876.307, 'Besni'], [195281, 609.8297259, 408.5356188, 0.742435528, 197426, 0.769656124, 1639.103, 'Besni'], [71502, 490.4334789, 189.4429399, 0.922383026, 75157, 0.500546035, 1182.852, 'Besni'], [223075, 694.2475503, 411.810369, 0.805073466, 225916, 0.764940471, 1812.569, 'Besni'], [235047, 772.956877, 388.201507, 0.864734549, 239093, 0.711672732, 1942.05, 'Besni'], [127292, 639.8506348, 258.3819447, 0.914840211, 129101, 0.534714521, 1496.062, 'Besni'], [181126, 949.6626718, 293.386698, 0.951082244, 225592, 0.414153748, 2352.029, 'Besni'], [225043, 740.0037432, 390.3008576, 0.849597917, 229195, 0.744187354, 1853.893, 'Besni'], [218459, 571.2892031, 492.2752785, 0.507431838, 228259, 0.731973651, 1947.46, 'Besni']]
Total outliers: 40
# Menghitung jumlah data per kelas pada kolom target
class_counts = data['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 450
Besni 450
Name: Class, dtype: int64
import matplotlib.pyplot as plt
# Menampilkan bar plot jumlah data per kelas
plt.figure(figsize=(8, 6))
class_counts.plot(kind='bar', color='skyblue')
plt.title('Jumlah Data per Kelas')
plt.xlabel('Kelas')
plt.ylabel('Jumlah Data')
plt.show()Dataset yang dihasilkan oleh fase persiapan data telah melalui serangkaian langkah pemahaman untuk digunakan dalam pemodelan menggunakan Logistic Regression.
Area: Rasio (Ratio) - Data ini memiliki titik nol yang bermakna (karena area tidak dapat negatif), dan perbandingan antara dua nilai area memiliki arti yang jelas.
Keliling: Rasio (Ratio) - Seperti area, keliling juga memiliki titik nol yang bermakna, dan perbandingan antara dua nilai keliling memiliki arti yang jelas.
Panjang Sumbu Utama: Rasio (Ratio) - Panjang sumbu utama memiliki titik nol yang bermakna, dan perbandingan antara dua nilai panjang sumbu utama memiliki arti yang jelas.
Panjang Sumbu Minor: Rasio (Ratio) - Panjang sumbu minor memiliki titik nol yang bermakna, dan perbandingan antara dua nilai panjang sumbu minor memiliki arti yang jelas.
Eksentrisitas: Interval - Eksentrisitas memiliki rentang tertentu (biasanya antara 0 dan 1), tetapi tidak memiliki titik nol yang bermakna. Ini dianggap sebagai data interval karena dapat diukur dan diurutkan, tetapi perbandingan nilai mungkin tidak selalu bermakna.
Luas Cembung: Rasio (Ratio) - Seperti area, luas cembung memiliki titik nol yang bermakna, dan perbandingan antara dua nilai luas cembung memiliki arti yang jelas.
Keluasan: Rasio (Ratio) - Seperti area, keluasan memiliki titik nol yang bermakna, dan perbandingan antara dua nilai keluasan memiliki arti yang jelas.
Kelas: Nominal - Kelas adalah data kategorikal tanpa tingkat ordinalitas atau urutan yang dapat diatribusikan ke kategori tersebut.
# Pisahkan data menjadi fitur (X) dan label (y)
X = data.drop('Class', axis=1)
y = data['Class']import pandas as pd
from sklearn.feature_selection import mutual_info_classif
import matplotlib.pyplot as plt
%matplotlib inline
# Menghitung mutual information
importances = mutual_info_classif(X, y)
# Membuat Series dari hasil perhitungan mutual information
feat_importances = pd.Series(importances, index=X.columns)
# Plot bar chart
feat_importances.plot(kind='barh', color='teal')
plt.xlabel('Mutual Information')
plt.show()for i, feature in enumerate(X.columns):
print(f"Mutual Information for {feature}: {importances[i]}")Mutual Information for Area: 0.2779525852508964
Mutual Information for MajorAxisLength: 0.34834107401237
Mutual Information for MinorAxisLength: 0.13486920234749755
Mutual Information for Eccentricity: 0.12911725093005044
Mutual Information for ConvexArea: 0.2975680307534163
Mutual Information for Extent: 0.029344123584051918
Mutual Information for Perimeter: 0.3585072377567762
data_dropExtent = data.drop('Extent', axis=1)
data_dropEccent = data_dropExtent.drop('Eccentricity', axis=1)
data_dropMinor = data_dropEccent.drop('MinorAxisLength', axis=1)data_dropExtent.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Area 900 non-null int64
1 MajorAxisLength 900 non-null float64
2 MinorAxisLength 900 non-null float64
3 Eccentricity 900 non-null float64
4 ConvexArea 900 non-null int64
5 Perimeter 900 non-null float64
6 Class 900 non-null object
dtypes: float64(4), int64(2), object(1)
memory usage: 49.3+ KB
data_dropEccent.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Area 900 non-null int64
1 MajorAxisLength 900 non-null float64
2 MinorAxisLength 900 non-null float64
3 ConvexArea 900 non-null int64
4 Perimeter 900 non-null float64
5 Class 900 non-null object
dtypes: float64(3), int64(2), object(1)
memory usage: 42.3+ KB
data_dropMinor.info()<class 'pandas.core.frame.DataFrame'>
RangeIndex: 900 entries, 0 to 899
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Area 900 non-null int64
1 MajorAxisLength 900 non-null float64
2 ConvexArea 900 non-null int64
3 Perimeter 900 non-null float64
4 Class 900 non-null object
dtypes: float64(2), int64(2), object(1)
memory usage: 35.3+ KB
# Menghapus baris yang mengandung outlier
data_dropOutlier = data[~outliers]
data_dropExtent_dropOutlier = data_dropExtent[~outliers]
data_dropEccent_dropOutlier = data_dropEccent[~outliers]
data_dropMinor_dropOutlier = data_dropMinor[~outliers]# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 435
Besni 425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropExtent_dropOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 435
Besni 425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropExtent_dropOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 435
Besni 425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropEccent_dropOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 435
Besni 425
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropMinor_dropOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 435
Besni 425
Name: Class, dtype: int64
# Pisahkan data menjadi fitur (X) dan label (y)
X_dropOutlier = data_dropOutlier.drop('Class', axis=1)
y_dropOutlier = data_dropOutlier['Class']# Pisahkan data menjadi fitur (X) dan label (y)
X_dropExtent_dropOutlier = data_dropExtent_dropOutlier.drop('Class', axis=1)
y_dropExtent_dropOutlier = data_dropExtent_dropOutlier['Class']# Pisahkan data menjadi fitur (X) dan label (y)
X_dropEccent_dropOutlier = data_dropEccent_dropOutlier.drop('Class', axis=1)
y_dropEccent_dropOutlier = data_dropEccent_dropOutlier['Class']# Pisahkan data menjadi fitur (X) dan label (y)
X_dropMinor_dropOutlier = data_dropMinor_dropOutlier.drop('Class', axis=1)
y_dropMinor_dropOutlier = data_dropMinor_dropOutlier['Class']data_revalueOutlier = data
columns = (data_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
median_value = data[column].median()
data_revalueOutlier.loc[outliers, column] = median_valuedata_dropExtent_revalueOutlier = data_dropExtent
columns = (data_dropExtent_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
median_value = data[column].median()
data_dropExtent_revalueOutlier.loc[outliers, column] = median_valuedata_dropEccent_revalueOutlier = data_dropEccent
columns = (data_dropEccent_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
median_value = data[column].median()
data_dropEccent_revalueOutlier.loc[outliers, column] = median_valuedata_dropMinor_revalueOutlier = data_dropMinor
columns = (data_dropMinor_revalueOutlier.drop('Class', axis=1)).columns
# Menggantikan nilai outlier dengan median
for column in columns:
median_value = data[column].median()
data_dropMinor_revalueOutlier.loc[outliers, column] = median_value# Menghitung jumlah data per kelas pada kolom target
class_counts = data_revalueOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 450
Besni 450
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropExtent_revalueOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 450
Besni 450
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropEccent_revalueOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 450
Besni 450
Name: Class, dtype: int64
# Menghitung jumlah data per kelas pada kolom target
class_counts = data_dropMinor_revalueOutlier['Class'].value_counts()
# Menampilkan hasil
print(class_counts)Kecimen 450
Besni 450
Name: Class, dtype: int64
# Pisahkan data menjadi fitur (X) dan label (y)
X_revalueOutlier = data_revalueOutlier.drop('Class', axis=1)
y_revalueOutlier = data_revalueOutlier['Class']# Pisahkan data menjadi fitur (X) dan label (y)
X_dropExtent_revalueOutlier = data_dropExtent_revalueOutlier.drop('Class', axis=1)
y_dropExtent_revalueOutlier = data_dropExtent_revalueOutlier['Class']# Pisahkan data menjadi fitur (X) dan label (y)
X_dropEccent_revalueOutlier = data_dropEccent_revalueOutlier.drop('Class', axis=1)
y_dropEccent_revalueOutlier = data_dropEccent_revalueOutlier['Class']# Pisahkan data menjadi fitur (X) dan label (y)
X_dropMinor_revalueOutlier = data_dropMinor_revalueOutlier.drop('Class', axis=1)
y_dropMinor_revalueOutlier = data_dropMinor_revalueOutlier['Class']Tidak ada atribut turunan yang dibangun dalam fase ini karena fitur morfologi awal sudah cukup untuk analisis.
Tidak ada rekaman sepenuhnya baru yang dibuat dalam fase ini karena data awal cukup representatif.
Data raisin tidak memerlukan penggabungan dari beberapa tabel atau rekaman karena dataset raisin awal sudah mencakup informasi yang dibutuhkan. Oleh karena itu, tahap ini tidak diperlukan.
Rumus Normalisasi menggunakan StandardScaler:
\([ X_{\text{normalized}} = \frac{X - \mu}{\sigma} ]\)
Keterangan: - \(X_{\text{normalized}}\) : Data yang telah dinormalisasi - \(X\) : Data asli - \(\mu\) : Rata-rata dari (X) - \(\sigma\) : Deviasi standar dari (X)
from sklearn.preprocessing import StandardScaler
# Normalisasi Z-Score
scaler_standard_dO = StandardScaler()
scaler_standard_dEx_dO = StandardScaler()
scaler_standard_dEc_dO = StandardScaler()
scaler_standard_dMi_dO = StandardScaler()
scaler_standard_rO = StandardScaler()
scaler_standard_dEx_rO = StandardScaler()
scaler_standard_dEc_rO = StandardScaler()
scaler_standard_dMi_rO = StandardScaler()X_dropOutlier_standard_normalized = scaler_standard_dO.fit_transform(X_dropOutlier)
X_dropExtent_dropOutlier_standard_normalized= scaler_standard_dEx_dO.fit_transform(X_dropExtent_dropOutlier)
X_dropEccent_dropOutlier_standard_normalized= scaler_standard_dEc_dO.fit_transform(X_dropEccent_dropOutlier)
X_dropMinor_dropOutlier_standard_normalized= scaler_standard_dMi_dO.fit_transform(X_dropMinor_dropOutlier)X_revalueOutlier_standard_normalized = scaler_standard_rO.fit_transform(X_revalueOutlier)
X_dropExtent_revalueOutlier_standard_normalized= scaler_standard_dEx_rO.fit_transform(X_dropExtent_revalueOutlier)
X_dropEccent_revalueOutlier_standard_normalized= scaler_standard_dEc_rO.fit_transform(X_dropEccent_revalueOutlier)
X_dropMinor_revalueOutlier_standard_normalized= scaler_standard_dMi_rO.fit_transform(X_dropMinor_revalueOutlier)from sklearn.preprocessing import MinMaxScaler
# Normalisasi Minmax
scaler_minmax_dO = MinMaxScaler()
scaler_minmax_dEx_dO = MinMaxScaler()
scaler_minmax_dEc_dO = MinMaxScaler()
scaler_minmax_dMi_dO = MinMaxScaler()
scaler_minmax_rO = MinMaxScaler()
scaler_minmax_dEx_rO = MinMaxScaler()
scaler_minmax_dEc_rO = MinMaxScaler()
scaler_minmax_dMi_rO = MinMaxScaler()X_dropOutlier_minmax_normalized = scaler_minmax_dO.fit_transform(X_dropOutlier)
X_dropExtent_dropOutlier_minmax_normalized= scaler_minmax_dEx_dO.fit_transform(X_dropExtent_dropOutlier)
X_dropEccent_dropOutlier_minmax_normalized= scaler_minmax_dEc_dO.fit_transform(X_dropEccent_dropOutlier)
X_dropMinor_dropOutlier_minmax_normalized= scaler_minmax_dMi_dO.fit_transform(X_dropMinor_dropOutlier)X_revalueOutlier_minmax_normalized = scaler_minmax_rO.fit_transform(X_revalueOutlier)
X_dropExtent_revalueOutlier_minmax_normalized= scaler_minmax_dEx_rO.fit_transform(X_dropExtent_revalueOutlier)
X_dropEccent_revalueOutlier_minmax_normalized= scaler_minmax_dEc_rO.fit_transform(X_dropEccent_revalueOutlier)
X_dropMinor_revalueOutlier_minmax_normalized= scaler_minmax_dMi_rO.fit_transform(X_dropMinor_revalueOutlier)Tidak ada perubahan format data yang diperlukan karena struktur dataset sudah sesuai dengan kebutuhan pemodelan.
Pemilihan teknik pemodelan yang sesuai adalah menggunakan algoritma Logistic Regression untuk klasifikasi varietas kismis.
Dataset akan dibagi menjadi dua bagian: set pelatihan (80% dari data) dan set uji (20% dari data). Model akan dilatih pada set pelatihan dan diuji pada set uji untuk mengevaluasi kinerja dan generalisasi.
from sklearn.model_selection import train_test_split# Pisahkan data menjadi set pelatihan dan set pengujian
X_dO_std_train, X_dO_std_test, y_dO_std_train, y_dO_std_test = train_test_split(X_dropOutlier_standard_normalized, y_dropOutlier, test_size=0.2, random_state=42)
X_dEx_dO_std_train, X_dEx_dO_std_test, y_dEx_dO_std_train, y_dEx_dO_std_test = train_test_split(X_dropExtent_dropOutlier_standard_normalized, y_dropExtent_dropOutlier, test_size=0.2, random_state=42)
X_dEc_dO_std_train, X_dEc_dO_std_test, y_dEc_dO_std_train, y_dEc_dO_std_test = train_test_split(X_dropEccent_dropOutlier_standard_normalized, y_dropEccent_dropOutlier, test_size=0.2, random_state=42)
X_dMi_dO_std_train, X_dMi_dO_std_test, y_dMi_dO_std_train, y_dMi_dO_std_test = train_test_split(X_dropMinor_dropOutlier_standard_normalized, y_dropMinor_dropOutlier, test_size=0.2, random_state=42)# Pisahkan data menjadi set pelatihan dan set pengujian
X_rO_std_train, X_rO_std_test, y_rO_std_train, y_rO_std_test = train_test_split(X_revalueOutlier_standard_normalized, y_revalueOutlier, test_size=0.2, random_state=42)
X_dEx_rO_std_train, X_dEx_rO_std_test, y_dEx_rO_std_train, y_dEx_rO_std_test = train_test_split(X_dropExtent_revalueOutlier_standard_normalized, y_dropExtent_revalueOutlier, test_size=0.2, random_state=42)
X_dEc_rO_std_train, X_dEc_rO_std_test, y_dEc_rO_std_train, y_dEc_rO_std_test = train_test_split(X_dropEccent_revalueOutlier_standard_normalized, y_dropEccent_revalueOutlier, test_size=0.2, random_state=42)
X_dMi_rO_std_train, X_dMi_rO_std_test, y_dMi_rO_std_train, y_dMi_rO_std_test = train_test_split(X_dropMinor_revalueOutlier_standard_normalized, y_dropMinor_revalueOutlier, test_size=0.2, random_state=42)# Pisahkan data menjadi set pelatihan dan set pengujian
X_dO_mmx_train, X_dO_mmx_test, y_dO_mmx_train, y_dO_mmx_test = train_test_split(X_dropOutlier_minmax_normalized, y_dropOutlier, test_size=0.2, random_state=42)
X_dEx_dO_mmx_train, X_dEx_dO_mmx_test, y_dEx_dO_mmx_train, y_dEx_dO_mmx_test = train_test_split(X_dropExtent_dropOutlier_minmax_normalized, y_dropExtent_dropOutlier, test_size=0.2, random_state=42)
X_dEc_dO_mmx_train, X_dEc_dO_mmx_test, y_dEc_dO_mmx_train, y_dEc_dO_mmx_test = train_test_split(X_dropEccent_dropOutlier_minmax_normalized, y_dropEccent_dropOutlier, test_size=0.2, random_state=42)
X_dMi_dO_mmx_train, X_dMi_dO_mmx_test, y_dMi_dO_mmx_train, y_dMi_dO_mmx_test = train_test_split(X_dropMinor_dropOutlier_minmax_normalized, y_dropMinor_dropOutlier, test_size=0.2, random_state=42)# Pisahkan data menjadi set pelatihan dan set pengujian
X_rO_mmx_train, X_rO_mmx_test, y_rO_mmx_train, y_rO_mmx_test = train_test_split(X_revalueOutlier_minmax_normalized, y_revalueOutlier, test_size=0.2, random_state=42)
X_dEx_rO_mmx_train, X_dEx_rO_mmx_test, y_dEx_rO_mmx_train, y_dEx_rO_mmx_test = train_test_split(X_dropExtent_revalueOutlier_minmax_normalized, y_dropExtent_revalueOutlier, test_size=0.2, random_state=42)
X_dEc_rO_mmx_train, X_dEc_rO_mmx_test, y_dEc_rO_mmx_train, y_dEc_rO_mmx_test = train_test_split(X_dropEccent_revalueOutlier_minmax_normalized, y_dropEccent_revalueOutlier, test_size=0.2, random_state=42)
X_dMi_rO_mmx_train, X_dMi_rO_mmx_test, y_dMi_rO_mmx_train, y_dMi_rO_mmx_test = train_test_split(X_dropMinor_revalueOutlier_minmax_normalized, y_dropMinor_revalueOutlier, test_size=0.2, random_state=42)from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score# Membuat model Regresi Logistik
LR_dO_std = LogisticRegression()
# Melatih model
LR_dO_std.fit(X_dO_std_train, y_dO_std_train)
# Melakukan prediksi
y_dO_std_pred = LR_dO_std.predict(X_dO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dO_std_test, y_dO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.813953488372093
# Membuat model Regresi Logistik
LR_dEx_dO_std = LogisticRegression()
# Melatih model
LR_dEx_dO_std.fit(X_dEx_dO_std_train, y_dEx_dO_std_train)
# Melakukan prediksi
y_dEx_dO_std_pred = LR_dEx_dO_std.predict(X_dEx_dO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dEx_dO_std_test, y_dEx_dO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_dEc_dO_std = LogisticRegression()
# Melatih model
LR_dEc_dO_std.fit(X_dEc_dO_std_train, y_dEc_dO_std_train)
# Melakukan prediksi
y_dEc_dO_std_pred = LR_dEc_dO_std.predict(X_dEc_dO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dEc_dO_std_test, y_dEc_dO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_dMi_dO_std = LogisticRegression()
# Melatih model
LR_dMi_dO_std.fit(X_dMi_dO_std_train, y_dMi_dO_std_train)
# Melakukan prediksi
y_dMi_dO_std_pred = LR_dMi_dO_std.predict(X_dMi_dO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dMi_dO_std_test, y_dMi_dO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8023255813953488
# Membuat model Regresi Logistik
LR_rO_std = LogisticRegression()
# Melatih model
LR_rO_std.fit(X_rO_std_train, y_rO_std_train)
# Melakukan prediksi
y_rO_std_pred = LR_rO_std.predict(X_rO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_rO_std_test, y_rO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dEx_rO_std = LogisticRegression()
# Melatih model
LR_dEx_rO_std.fit(X_dEx_rO_std_train, y_dEx_rO_std_train)
# Melakukan prediksi
y_dEx_rO_std_pred = LR_dEx_rO_std.predict(X_dEx_rO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dEx_rO_std_test, y_dEx_rO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dEc_rO_std = LogisticRegression()
# Melatih model
LR_dEc_rO_std.fit(X_dEc_rO_std_train, y_dEc_rO_std_train)
# Melakukan prediksi
y_dEc_rO_std_pred = LR_dEc_rO_std.predict(X_dEc_rO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dEc_rO_std_test, y_dEc_rO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dMi_rO_std = LogisticRegression()
# Melatih model
LR_dMi_rO_std.fit(X_dMi_rO_std_train, y_dMi_rO_std_train)
# Melakukan prediksi
y_dMi_rO_std_pred = LR_dMi_rO_std.predict(X_dMi_rO_std_test)
# Evaluasi model
accuracy = accuracy_score(y_dMi_rO_std_test, y_dMi_rO_std_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8333333333333334
# Membuat model Regresi Logistik
LR_dO_mmx = LogisticRegression()
# Melatih model
LR_dO_mmx.fit(X_dO_mmx_train, y_dO_mmx_train)
# Melakukan prediksi
y_dO_mmx_pred = LR_dO_mmx.predict(X_dO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dO_mmx_test, y_dO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_dEx_dO_mmx = LogisticRegression()
# Melatih model
LR_dEx_dO_mmx.fit(X_dEx_dO_mmx_train, y_dEx_dO_mmx_train)
# Melakukan prediksi
y_dEx_dO_mmx_pred = LR_dEx_dO_mmx.predict(X_dEx_dO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dEx_dO_mmx_test, y_dEx_dO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8023255813953488
# Membuat model Regresi Logistik
LR_dEc_dO_mmx = LogisticRegression()
# Melatih model
LR_dEc_dO_mmx.fit(X_dEc_dO_mmx_train, y_dEc_dO_mmx_train)
# Melakukan prediksi
y_dEc_dO_mmx_pred = LR_dEc_dO_mmx.predict(X_dEc_dO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dEc_dO_mmx_test, y_dEc_dO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.813953488372093
# Membuat model Regresi Logistik
LR_dMi_dO_mmx = LogisticRegression()
# Melatih model
LR_dMi_dO_mmx.fit(X_dMi_dO_mmx_train, y_dMi_dO_mmx_train)
# Melakukan prediksi
y_dMi_dO_mmx_pred = LR_dMi_dO_mmx.predict(X_dMi_dO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dMi_dO_mmx_test, y_dMi_dO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8081395348837209
# Membuat model Regresi Logistik
LR_rO_mmx = LogisticRegression()
# Melatih model
LR_rO_mmx.fit(X_rO_mmx_train, y_rO_mmx_train)
# Melakukan prediksi
y_rO_mmx_pred = LR_rO_mmx.predict(X_rO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_rO_mmx_test, y_rO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8444444444444444
# Membuat model Regresi Logistik
LR_dEx_rO_mmx = LogisticRegression()
# Melatih model
LR_dEx_rO_mmx.fit(X_dEx_rO_mmx_train, y_dEx_rO_mmx_train)
# Melakukan prediksi
y_dEx_rO_mmx_pred = LR_dEx_rO_mmx.predict(X_dEx_rO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dEx_rO_mmx_test, y_dEx_rO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dEc_rO_mmx = LogisticRegression()
# Melatih model
LR_dEc_rO_mmx.fit(X_dEc_rO_mmx_train, y_dEc_rO_mmx_train)
# Melakukan prediksi
y_dEc_rO_mmx_pred = LR_dEc_rO_mmx.predict(X_dEc_rO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dEc_rO_mmx_test, y_dEc_rO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8388888888888889
# Membuat model Regresi Logistik
LR_dMi_rO_mmx = LogisticRegression()
# Melatih model
LR_dMi_rO_mmx.fit(X_dMi_rO_mmx_train, y_dMi_rO_mmx_train)
# Melakukan prediksi
y_dMi_rO_mmx_pred = LR_dMi_rO_mmx.predict(X_dMi_rO_mmx_test)
# Evaluasi model
accuracy = accuracy_score(y_dMi_rO_mmx_test, y_dMi_rO_mmx_pred)
print(f'Akurasi: {accuracy}')Akurasi: 0.8333333333333334
\[\begin{equation} P(Y=1) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_n X_n)}} \end{equation}\]
\(P(Y=1)\) adalah probabilitas bahwa variabel dependen \(Y\) sama dengan 1.
\((\beta_0, \beta_1, \beta_2, \ldots, \beta_n)\) adalah parameter yang akan diestimasi.
\((X_1, X_2, \ldots, X_n)\) adalah variabel independen.
Model Logistic Regression menghasilkan parameter berikut: koefisien untuk setiap atribut, intercept, dan fungsi logistik yang menggambarkan probabilitas.
Model yang memenuhi kriteria keberhasilan bisnis dianggap sebagai model yang disetujui. Sehingga, model Logistic Regression dengan parameter hasil terbaik dianggap disetujui.
import joblib
# Menyimpan scaler ke dalam file
joblib.dump(scaler_minmax_rO, '/content/drive/MyDrive/psd/raisin/scaler.pkl')import joblib
# Simpan model ke dalam file
joblib.dump(LR_rO_mmx, '/content/drive/MyDrive/psd/raisin/LR_model.pkl')Proses pemodelan dan evaluasi telah dilaksanakan sesuai rencana proyek. Semua aktivitas dilakukan sesuai dengan pedoman data mining yang berlaku. Tidak ada isu kualitas yang signifikan yang terlewat selama proses.
Implementasi model Logistic Regression akan dilakukan dengan menyertakan kode implementasi dalam lingkungan produksi, yaitu Streamlit.
Laporan akhir berisi rangkuman menyeluruh tentang proyek, metode yang diterapkan, hasil evaluasi model, dan rekomendasi untuk implementasi serta pemeliharaan berkelanjutan, yang akan disajikan melalui website POSIT dengan penjelasan mendalam pada setiap tahapan proses data mining.
Website POSIT: teks link