Mari kita import library yang diperlukan untuk implementasi neural network.
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport tensorflow as tffrom tensorflow import kerasfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.metrics import accuracy_score, classification_report, confusion_matrix# Set random seed untuk reproduktifitasnp.random.seed(42)tf.random.set_seed(42)print(f"TensorFlow version: {tf.__version__}")
TensorFlow version: 2.15.0
2. Generate Data Sederhana untuk Percobaan
Kita akan membuat data sederhana untuk demonstrasi neural network. Untuk perceptron, kita akan membuat data yang linearly separable, dan untuk multi-layer neural network, kita akan menggunakan data yang lebih kompleks.
# Data untuk Perceptron (linearly separable)def generate_linear_data(n_samples=100):# Generate random points X = np.random.randn(n_samples, 2)# Create a simple linear boundary: y = x y = (X[:, 0] + X[:, 1] >0).astype(int)return X, y# Data untuk Multi-layer NN (non-linearly separable)def generate_circular_data(n_samples=100):# Generate random points X = np.random.randn(n_samples, 2)# Create a circular boundary: points inside a circle are class 1 y = (X[:, 0]**2+ X[:, 1]**2<2).astype(int)return X, y# Generate dataX_linear, y_linear = generate_linear_data(200)X_circular, y_circular = generate_circular_data(200)# Visualisasi dataplt.figure(figsize=(12, 5))plt.subplot(1, 2, 1)plt.scatter(X_linear[:, 0], X_linear[:, 1], c=y_linear, cmap='viridis', alpha=0.8)plt.title('Data Linear (untuk Perceptron)')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.grid(True)plt.subplot(1, 2, 2)plt.scatter(X_circular[:, 0], X_circular[:, 1], c=y_circular, cmap='viridis', alpha=0.8)plt.title('Data Non-Linear (untuk Multi-layer NN)')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.grid(True)plt.tight_layout()plt.show()
3. Implementasi Perceptron Sederhana
Perceptron adalah neural network paling sederhana dengan satu neuron saja. Kita akan mengimplementasikan perceptron menggunakan TensorFlow untuk data klasifikasi linear.
# Split data untuk training dan testingX_train, X_test, y_train, y_test = train_test_split(X_linear, y_linear, test_size=0.2, random_state=42)# Implementasi Perceptron dengan TensorFlow/Kerasperceptron_model = keras.Sequential([# Input layer + Output layer (perceptron hanya memiliki 1 layer)# Input shape: 2 fitur, Output: 1 neuron dengan aktivasi sigmoid keras.layers.Dense(1, activation='sigmoid', input_shape=(2,))])# Compile modelperceptron_model.compile( optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])# Ringkasan modelperceptron_model.summary()# Training modelhistory_perceptron = perceptron_model.fit( X_train, y_train, epochs=50, batch_size=16, validation_split=0.2, verbose=1)# Evaluasi modelperceptron_loss, perceptron_accuracy = perceptron_model.evaluate(X_test, y_test)print(f"\nPerceptron Test Accuracy: {perceptron_accuracy:.4f}")
# Visualisasi hasil trainingplt.figure(figsize=(12, 5))# Plot history lossplt.subplot(1, 2, 1)plt.plot(history_perceptron.history['loss'], label='Training Loss')plt.plot(history_perceptron.history['val_loss'], label='Validation Loss')plt.title('Perceptron Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend()plt.grid(True)# Plot history accuracyplt.subplot(1, 2, 2)plt.plot(history_perceptron.history['accuracy'], label='Training Accuracy')plt.plot(history_perceptron.history['val_accuracy'], label='Validation Accuracy')plt.title('Perceptron Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.legend()plt.grid(True)plt.tight_layout()plt.show()
# Visualisasi boundary keputusan dari perceptrondef plot_decision_boundary(model, X, y):# Set min and max values for both features x_min, x_max = X[:, 0].min() -1, X[:, 0].max() +1 y_min, y_max = X[:, 1].min() -1, X[:, 1].max() +1# Create a mesh grid xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))# Flatten the mesh grid to pass to model mesh_points = np.c_[xx.ravel(), yy.ravel()]# Predict with the model Z = model.predict(mesh_points) Z = Z.reshape(xx.shape)# Plot the contour and training examples plt.figure(figsize=(10, 8)) plt.contourf(xx, yy, Z, alpha=0.8, cmap='viridis') plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', edgecolors='k', alpha=0.8) plt.xlabel('Feature 1') plt.ylabel('Feature 2') plt.title('Decision Boundary') plt.grid(True) plt.colorbar() plt.show()# Plot decision boundary for perceptronplot_decision_boundary(perceptron_model, X_linear, y_linear)
c:\Users\derik\anaconda3\Lib\site-packages\seaborn\axisgrid.py:118: UserWarning: The figure layout has changed to tight
self._figure.tight_layout(*args, **kwargs)
<Figure size 1200x1000 with 0 Axes>
# Preprocessing dataX = iris_df.drop(['species', 'target'], axis=1).valuesy = iris_df['target'].values# One-hot encoding untuk target (karena multi-class)y_onehot = keras.utils.to_categorical(y)# Split dataX_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)# Normalisasi fiturscaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)# Implementasi Neural Network untuk data tabulartabular_model = keras.Sequential([# Input layer: 4 fitur (dari dataset Iris), 10 neuron dengan aktivasi ReLU keras.layers.Dense(10, activation='relu', input_shape=(X.shape[1],)),# Hidden layer: 8 neuron dengan aktivasi ReLU keras.layers.Dense(8, activation='relu'),# Output layer: 3 neuron dengan aktivasi softmax untuk klasifikasi multi-class (3 kelas bunga Iris) keras.layers.Dense(3, activation='softmax')])# Compile modeltabular_model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# Ringkasan modeltabular_model.summary()# Training modelhistory_tabular = tabular_model.fit( X_train, y_train, epochs=100, batch_size=16, validation_split=0.2, verbose=1)# Evaluasi modeltabular_loss, tabular_accuracy = tabular_model.evaluate(X_test, y_test)print(f"\nTabular NN Test Accuracy: {tabular_accuracy:.4f}")
6. Eksperimen dengan Hyperparameter (Jumlah Layer & Neuron)
Mari kita coba variasi arsitektur neural network untuk melihat pengaruhnya pada performa model.
# Fungsi untuk membuat dan melatih model dengan arsitektur yang berbedadef create_train_evaluate_model(hidden_layers, X_train, y_train, X_test, y_test): model = keras.Sequential()# Input layer model.add(keras.layers.Dense(hidden_layers[0], activation='relu', input_shape=(X_train.shape[1],)))# Hidden layersfor units in hidden_layers[1:]: model.add(keras.layers.Dense(units, activation='relu'))# Output layer (3 neuron untuk 3 kelas bunga Iris) model.add(keras.layers.Dense(3, activation='softmax'))# Compile model model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'] )# Train model history = model.fit( X_train, y_train, epochs=50, batch_size=16, validation_split=0.2, verbose=0 )# Evaluate model _, accuracy = model.evaluate(X_test, y_test, verbose=0)return model, history, accuracy# Definisi arsitektur yang berbeda untuk diujiarchitectures = [ [4], # 1 hidden layer with 4 neurons [8], # 1 hidden layer with 8 neurons [4, 4], # 2 hidden layers with 4 neurons each [8, 4], # 2 hidden layers with 8 and 4 neurons [16, 8, 4] # 3 hidden layers with 16, 8, and 4 neurons]# Evaluasi setiap arsitekturresults = []histories = []for i, architecture inenumerate(architectures):print(f"Training model with architecture: {architecture}") model, history, accuracy = create_train_evaluate_model( architecture, X_train, y_train, X_test, y_test ) results.append({'architecture': architecture,'accuracy': accuracy }) histories.append(history)print(f"Test accuracy: {accuracy:.4f}\n")# Tampilkan hasil dalam bentuk tabelresults_df = pd.DataFrame(results)results_df['architecture'] = results_df['architecture'].apply(lambda x: str(x))print("Comparison of Different Architectures:")print(results_df.sort_values('accuracy', ascending=False))
Training model with architecture: [4]
Test accuracy: 0.8000
Training model with architecture: [8]
Test accuracy: 0.9000
Training model with architecture: [4, 4]
Test accuracy: 0.8333
Training model with architecture: [8, 4]
Test accuracy: 0.6333
Training model with architecture: [16, 8, 4]
Test accuracy: 0.9667
Comparison of Different Architectures:
architecture accuracy
4 [16, 8, 4] 0.966667
1 [8] 0.900000
2 [4, 4] 0.833333
0 [4] 0.800000
3 [8, 4] 0.633333
# Visualisasi perbandingan akurasiplt.figure(figsize=(10, 6))plt.bar( results_df['architecture'], results_df['accuracy'], color='skyblue')plt.title('Accuracy of Different Neural Network Architectures')plt.xlabel('Architecture (Hidden Layers)')plt.ylabel('Test Accuracy')plt.ylim(0.8, 1.0)plt.grid(axis='y', linestyle='--', alpha=0.7)plt.xticks(rotation=45)plt.tight_layout()plt.show()
7. Kesimpulan
Dari percobaan yang telah kita lakukan, kita dapat menyimpulkan beberapa hal:
Perceptron (Single Neuron): Sangat baik untuk masalah klasifikasi linear, tetapi tidak dapat menangani data yang tidak linear seperti pola lingkaran.
Multi-layer Neural Network: Mampu mempelajari pola non-linear dengan baik melalui struktur hidden layer yang kompleks.
Neural Network untuk Data Tabular: Dapat diterapkan dengan efektif pada dataset tabular seperti Iris setelah dilakukan preprocessing yang tepat.
Pengaruh Arsitektur: Jumlah layer dan neuron dapat mempengaruhi performa model. Arsitektur yang lebih kompleks tidak selalu menghasilkan performa yang lebih baik dan bisa mengarah ke overfitting.
Neural network sangat fleksibel dan dapat digunakan untuk berbagai jenis data. Preprocessing data dan pemilihan arsitektur yang tepat sangat penting untuk mencapai performa yang optimal.
# Split data untuk training dan testingX_train, X_test, y_train, y_test = train_test_split(X_linear, y_linear, test_size=0.2, random_state=42)# Implementasi Perceptron dengan TensorFlow/Kerasperceptron_model = keras.Sequential([# Input layer + Output layer (perceptron hanya memiliki 1 layer)# Input shape: 2 fitur, Output: 1 neuron dengan aktivasi sigmoid keras.layers.Dense(1, activation='sigmoid', input_shape=(2,))])# Compile modelperceptron_model.compile( optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])# Ringkasan modelperceptron_model.summary()# Training modelhistory_perceptron = perceptron_model.fit( X_train, y_train, epochs=50, batch_size=16, validation_split=0.2, verbose=1)# Evaluasi modelperceptron_loss, perceptron_accuracy = perceptron_model.evaluate(X_test, y_test)print(f"\nPerceptron Test Accuracy: {perceptron_accuracy:.4f}")
# Split data untuk training dan testingX_train, X_test, y_train, y_test = train_test_split(X_circular, y_circular, test_size=0.2, random_state=42)# Implementasi Multi-layer NN dengan TensorFlow/Kerasmultilayer_model = keras.Sequential([# Input layer: 2 fitur, 8 neuron dengan aktivasi ReLU keras.layers.Dense(8, activation='relu', input_shape=(2,)),# Hidden layer: 4 neuron dengan aktivasi ReLU keras.layers.Dense(4, activation='relu'),# Output layer: 1 neuron dengan aktivasi sigmoid untuk klasifikasi biner keras.layers.Dense(1, activation='sigmoid')])# Compile modelmultilayer_model.compile( optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# Ringkasan modelmultilayer_model.summary()# Training modelhistory_multilayer = multilayer_model.fit( X_train, y_train, epochs=100, batch_size=16, validation_split=0.2, verbose=1)# Evaluasi modelmultilayer_loss, multilayer_accuracy = multilayer_model.evaluate(X_test, y_test)print(f"\nMulti-layer NN Test Accuracy: {multilayer_accuracy:.4f}")
# Preprocessing dataX = iris_df.drop(['species', 'target'], axis=1).valuesy = iris_df['target'].values# One-hot encoding untuk target (karena multi-class)y_onehot = keras.utils.to_categorical(y)# Split dataX_train, X_test, y_train, y_test = train_test_split(X, y_onehot, test_size=0.2, random_state=42)# Normalisasi fiturscaler = StandardScaler()X_train = scaler.fit_transform(X_train)X_test = scaler.transform(X_test)# Implementasi Neural Network untuk data tabulartabular_model = keras.Sequential([# Input layer: 4 fitur (dari dataset Iris), 10 neuron dengan aktivasi ReLU keras.layers.Dense(10, activation='relu', input_shape=(X.shape[1],)),# Hidden layer: 8 neuron dengan aktivasi ReLU keras.layers.Dense(8, activation='relu'),# Output layer: 3 neuron dengan aktivasi softmax untuk klasifikasi multi-class (3 kelas bunga Iris) keras.layers.Dense(3, activation='softmax')])# Compile modeltabular_model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])# Ringkasan modeltabular_model.summary()# Training modelhistory_tabular = tabular_model.fit( X_train, y_train, epochs=100, batch_size=16, validation_split=0.2, verbose=1)# Evaluasi modeltabular_loss, tabular_accuracy = tabular_model.evaluate(X_test, y_test)print(f"\nTabular NN Test Accuracy: {tabular_accuracy:.4f}")
# Fungsi untuk membuat dan melatih model dengan arsitektur yang berbedadef create_train_evaluate_model(hidden_layers, X_train, y_train, X_test, y_test): model = keras.Sequential()# Input layer model.add(keras.layers.Dense(hidden_layers[0], activation='relu', input_shape=(X_train.shape[1],)))# Hidden layersfor units in hidden_layers[1:]: model.add(keras.layers.Dense(units, activation='relu'))# Output layer (3 neuron untuk 3 kelas bunga Iris) model.add(keras.layers.Dense(3, activation='softmax'))# Compile model model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'] )# Train model history = model.fit( X_train, y_train, epochs=50, batch_size=16, validation_split=0.2, verbose=0 )# Evaluate model _, accuracy = model.evaluate(X_test, y_test, verbose=0)return model, history, accuracy# Definisi arsitektur yang berbeda untuk diujiarchitectures = [ [4], # 1 hidden layer with 4 neurons [8], # 1 hidden layer with 8 neurons [4, 4], # 2 hidden layers with 4 neurons each [8, 4], # 2 hidden layers with 8 and 4 neurons [16, 8, 4] # 3 hidden layers with 16, 8, and 4 neurons]# Evaluasi setiap arsitekturresults = []histories = []for i, architecture inenumerate(architectures):print(f"Training model with architecture: {architecture}") model, history, accuracy = create_train_evaluate_model( architecture, X_train, y_train, X_test, y_test ) results.append({'architecture': architecture,'accuracy': accuracy }) histories.append(history)print(f"Test accuracy: {accuracy:.4f}\n")# Tampilkan hasil dalam bentuk tabelresults_df = pd.DataFrame(results)results_df['architecture'] = results_df['architecture'].apply(lambda x: str(x))print("Comparison of Different Architectures:")print(results_df.sort_values('accuracy', ascending=False))
Penjelasan Layer dalam Neural Network
Pada implementasi neural network, terdapat beberapa jenis layer yang penting untuk dipahami:
Input Layer
Merupakan layer pertama yang menerima data input
Jumlah neuron sesuai dengan jumlah fitur dalam dataset
Pada Keras, input layer didefinisikan melalui parameter input_shape
Hidden Layer
Layer yang berada di antara input dan output layer
Jumlah hidden layer dan neuron dapat bervariasi
Berperan dalam ekstraksi pola dan fitur kompleks dari data
Biasanya menggunakan fungsi aktivasi non-linear seperti ReLU
Output Layer
Layer terakhir yang menghasilkan output/prediksi model
Jumlah neuron sesuai dengan target prediksi:
1 neuron + aktivasi sigmoid: klasifikasi biner
n neuron + aktivasi softmax: klasifikasi multi-class dengan n kelas
Pilihan arsitektur (jumlah layer dan neuron) sangat mempengaruhi kemampuan model dalam menangkap kompleksitas data.