Modul Python AI Machine Learning
Modul Python AI Machine Learning
2025
DAFTAR ISI
Modul 1: Dasar-Dasar Python .................................................. 3
Modul 2: Python untuk Data Science ........................................ 12
Modul 3: Machine Learning Fundamentals ................................. 22
Modul 4: Deep Learning dengan TensorFlow/PyTorch .................. 35
Modul 5: Computer Vision ...................................................... 48
Modul 6: Natural Language Processing (NLP) ............................ 60
Modul 7: Advanced AI & MLOps .............................................. 72
Modul 8: Proyek Capstone ...................................................... 85
MODUL 1: DASAR-DASAR PYTHON
Estimasi waktu: 2-3 minggu | Tingkat: Pemula
# Verifikasi instalasi
python --version
pip --version
# Type checking
print(type(integer_var)) # <class 'int'>
print(isinstance(float_var, float)) # True
# Type conversion
str_num = "100"
int_num = int(str_num)
float_num = float(str_num)
Control Flow
# If-elif-else
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
else:
grade = "F"
# For loops
for i in range(5):
print(i)
# While loops
count = 0
while count < 5:
print(count)
count += 1
# List comprehension
squares = [x**2 for x in range(10)]
even_squares = [x**2 for x in range(10) if x % 2 == 0]
1.3 Functions dan Lambda
# Basic function
def greet(name, greeting="Hello"):
"""Docstring: fungsi untuk menyapa"""
return f"{greeting}, {name}!"
print(greet("John"))
print(greet("Jane", "Hi"))
# Lambda functions
square = lambda x: x ** 2
add = lambda a, b: a + b
def _initialize_weights(self):
"""Private method untuk inisialisasi weights"""
import random
for i in range(len([Link]) - 1):
w = [[[Link]() for _ in range([Link][i+1])]
for _ in range([Link][i])]
[Link](w)
@staticmethod
def _activate(inputs, weights):
"""Static method untuk aktivasi"""
# Simplified matrix multiplication
return [sum(i*w for i, w in zip(inputs, col))
for col in zip(*weights)]
def __str__(self):
return f"NeuralNetwork(layers={[Link]})"
def __repr__(self):
return self.__str__()
# Inheritance
class ConvolutionalNN(NeuralNetwork):
def __init__(self, layers, kernel_size=3):
super().__init__(layers)
self.kernel_size = kernel_size
# Usage
nn = NeuralNetwork([784, 128, 64, 10])
print(nn)
# Reading
with open("[Link]", "r") as f:
content = [Link]()
# JSON handling
import json
# Exception handling
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"Error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
finally:
print("Cleanup code here")
# Custom exception
class ModelNotTrainedError(Exception):
pass
# Array creation
arr1d = [Link]([1, 2, 3, 4, 5])
arr2d = [Link]([[1, 2, 3], [4, 5, 6]])
zeros = [Link]((3, 4))
ones = [Link]((2, 3))
identity = [Link](4)
random_arr = [Link](3, 3) # normal distribution
linspace = [Link](0, 10, 50) # 50 points from 0 to 10
# Array properties
print(f"Shape: {[Link]}")
print(f"Dtype: {[Link]}")
print(f"Ndim: {[Link]}")
# Reshaping
reshaped = [Link](6, 1)
flattened = [Link]()
transposed = arr2d.T
# Broadcasting
matrix = [Link]([[1, 2, 3], [4, 5, 6]])
vector = [Link]([10, 20, 30])
result = matrix + vector # broadcasts vector to each row
# Aggregations
print([Link](arr2d))
print([Link](arr2d, axis=0)) # mean per column
print([Link](arr2d, axis=1)) # std per row
print([Link](arr2d))
print([Link](arr2d)) # index of max
# Creating DataFrames
df = [Link]({
'name': ['Alice', 'Bob', 'Charlie', 'David'],
'age': [25, 30, 35, 28],
'salary': [50000, 60000, 70000, 55000],
'department': ['IT', 'HR', 'IT', 'Finance']
})
# Reading data
df_csv = pd.read_csv('[Link]')
df_excel = pd.read_excel('[Link]')
df_json = pd.read_json('[Link]')
# Basic info
print([Link]())
print([Link]())
print([Link]())
print([Link])
# Selection
print(df['name']) # single column
print(df[['name', 'age']]) # multiple columns
print([Link][0]) # row by label
print([Link][0:2]) # rows by position
print([Link][df['age'] > 28]) # conditional
# Data manipulation
df['bonus'] = df['salary'] * 0.1 # new column
df['age_group'] = df['age'].apply(lambda x: 'young' if x < 30 else
'senior')
# Groupby operations
grouped = [Link]('department').agg({
'salary': ['mean', 'max'],
'age': 'mean'
})
# Merging DataFrames
df1 = [Link]({'id': [1, 2, 3], 'value': ['a', 'b', 'c']})
df2 = [Link]({'id': [2, 3, 4], 'score': [10, 20, 30]})
merged = [Link](df1, df2, on='id', how='inner')
# Pivot tables
pivot = df.pivot_table(values='salary',
index='department',
aggfunc=['mean', 'count'])
# Basic plots
fig, axes = [Link](2, 2, figsize=(12, 10))
# Line plot
x = [Link](0, 10, 100)
axes[0, 0].plot(x, [Link](x), label='sin(x)')
axes[0, 0].plot(x, [Link](x), label='cos(x)')
axes[0, 0].set_title('Line Plot')
axes[0, 0].legend()
axes[0, 0].grid(True)
# Scatter plot
[Link](42)
x_scatter = [Link](100)
y_scatter = x_scatter + [Link](100) * 0.5
axes[0, 1].scatter(x_scatter, y_scatter, alpha=0.6)
axes[0, 1].set_title('Scatter Plot')
# Bar plot
categories = ['A', 'B', 'C', 'D']
values = [23, 45, 56, 78]
axes[1, 0].bar(categories, values, color='steelblue')
axes[1, 0].set_title('Bar Plot')
# Histogram
data = [Link](1000)
axes[1, 1].hist(data, bins=30, edgecolor='black')
axes[1, 1].set_title('Histogram')
plt.tight_layout()
[Link]('[Link]', dpi=150)
[Link]()
# Distribution plot
[Link](tips['total_bill'], kde=True, ax=axes[0, 0])
# Box plot
[Link](x='day', y='total_bill', data=tips, ax=axes[0, 1])
plt.tight_layout()
[Link]()
# Sample data
df = [Link]({
'age': [25, 30, None, 35, 28],
'salary': [50000, 60000, 70000, None, 55000],
'department': ['IT', 'HR', 'IT', 'Finance', 'HR'],
'target': [0, 1, 1, 0, 1]
})
# One-Hot Encoding
df_encoded = pd.get_dummies(df, columns=['department'])
# Feature scaling
scaler = StandardScaler() # or MinMaxScaler()
X = df[['age', 'salary']].values
X_scaled = scaler.fit_transform(X)
# Train-test split
X = df_encoded.drop('target', axis=1)
y = df_encoded['target']
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
# Feature selection
from sklearn.feature_selection import SelectKBest, f_classif
selector = SelectKBest(f_classif, k=5)
X_selected = selector.fit_transform(X_train, y_train)
3.2 Supervised Learning - Classification
from sklearn.linear_model import LogisticRegression
from [Link] import DecisionTreeClassifier
from [Link] import RandomForestClassifier,
GradientBoostingClassifier
from [Link] import SVC
from [Link] import KNeighborsClassifier
from [Link] import accuracy_score, classification_report
from [Link] import confusion_matrix, roc_auc_score
# Scale features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = [Link](X_test)
# Models dictionary
models = {
'Logistic Regression': LogisticRegression(max_iter=1000),
'Decision Tree': DecisionTreeClassifier(max_depth=5),
'Random Forest': RandomForestClassifier(n_estimators=100),
'Gradient Boosting': GradientBoostingClassifier(),
'SVM': SVC(kernel='rbf', probability=True),
'KNN': KNeighborsClassifier(n_neighbors=5)
}
print(f"\n{name}:")
print(f"Accuracy: {accuracy:.4f}")
print(classification_report(y_test, y_pred))
# Scale features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = [Link](X_test)
# Models
models = {
'Linear Regression': LinearRegression(),
'Ridge': Ridge(alpha=1.0),
'Lasso': Lasso(alpha=0.1),
'Decision Tree': DecisionTreeRegressor(max_depth=10),
'Random Forest': RandomForestRegressor(n_estimators=100),
'Gradient Boosting': GradientBoostingRegressor()
}
# Evaluate
for name, model in [Link]():
[Link](X_train_scaled, y_train)
y_pred = [Link](X_test_scaled)
print(f"{name}:")
print(f" RMSE: {rmse:.4f}, MAE: {mae:.4f}, R2: {r2:.4f}")
# Evaluate clustering
silhouette = silhouette_score(X_scaled, clusters)
print(f"Silhouette Score: {silhouette:.4f}")
# DBSCAN (density-based)
dbscan = DBSCAN(eps=0.5, min_samples=5)
db_clusters = dbscan.fit_predict(X_scaled)
# Dimensionality reduction
# PCA
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)
print(f"Explained variance ratio: {pca.explained_variance_ratio_}")
# t-SNE
tsne = TSNE(n_components=2, random_state=42, perplexity=30)
X_tsne = tsne.fit_transform(X_scaled)
# Visualization
import [Link] as plt
fig, axes = [Link](1, 2, figsize=(14, 5))
# Grid Search
param_grid = {
'n_estimators': [50, 100, 200],
'max_depth': [5, 10, 15, None],
'min_samples_split': [2, 5, 10],
'min_samples_leaf': [1, 2, 4]
}
grid_search = GridSearchCV(
RandomForestClassifier(random_state=42),
param_grid,
cv=5,
scoring='accuracy',
n_jobs=-1,
verbose=1
)
grid_search.fit(X_train_scaled, y_train)
param_dist = {
'n_estimators': randint(50, 300),
'max_depth': randint(3, 20),
'min_samples_split': randint(2, 20),
'min_samples_leaf': randint(1, 10)
}
random_search = RandomizedSearchCV(
RandomForestClassifier(random_state=42),
param_dist,
n_iter=50,
cv=5,
scoring='accuracy',
n_jobs=-1,
random_state=42
)
random_search.fit(X_train_scaled, y_train)
# Voting Classifier
voting_clf = VotingClassifier(
estimators=[
('lr', LogisticRegression(max_iter=1000)),
('rf', RandomForestClassifier(n_estimators=100)),
('svm', SVC(probability=True))
],
voting='soft' # 'hard' for majority voting
)
voting_clf.fit(X_train_scaled, y_train)
# Stacking Classifier
stacking_clf = StackingClassifier(
estimators=[
('rf', RandomForestClassifier(n_estimators=100)),
('gb', GradientBoostingClassifier()),
('svm', SVC(probability=True))
],
final_estimator=LogisticRegression(),
cv=5
)
stacking_clf.fit(X_train_scaled, y_train)
# Bagging
bagging_clf = BaggingClassifier(
estimator=DecisionTreeClassifier(),
n_estimators=100,
max_samples=0.8,
bootstrap=True,
random_state=42
)
# AdaBoost
ada_clf = AdaBoostClassifier(
estimator=DecisionTreeClassifier(max_depth=1),
n_estimators=100,
learning_rate=0.1,
random_state=42
)
# Output layer
error = [Link][-1] - y
deltas[-1] = error * self.sigmoid_derivative([Link][-1])
# Hidden layers
for i in range(len([Link]) - 2, -1, -1):
error = [Link](deltas[i+1], [Link][i+1].T)
deltas[i] = error *
self.sigmoid_derivative([Link][i+1])
# Update weights
for i in range(len([Link])):
[Link][i] -= learning_rate * [Link](
[Link][i].T, deltas[i]
) / m
[Link][i] -= learning_rate * [Link](
deltas[i], axis=0, keepdims=True
) / m
# Usage
nn = SimpleNeuralNetwork([784, 128, 64, 10])
# Compile
model_functional.compile(
optimizer=[Link](learning_rate=0.001),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
# Callbacks
callbacks = [
EarlyStopping(patience=5, restore_best_weights=True),
ModelCheckpoint('best_model.keras', save_best_only=True)
]
# Training
# history = model_functional.fit(
# X_train, y_train,
# epochs=50,
# batch_size=32,
# validation_split=0.2,
# callbacks=callbacks
# )
# Model summary
model_functional.summary()
# Block 2
layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
[Link](),
layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
layers.MaxPooling2D((2, 2)),
[Link](0.25),
# Block 3
layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
[Link](),
layers.Conv2D(128, (3, 3), activation='relu', padding='same'),
layers.MaxPooling2D((2, 2)),
[Link](0.25),
# Classifier
[Link](),
[Link](256, activation='relu'),
[Link](),
[Link](0.5),
[Link](num_classes, activation='softmax')
])
return model
# Create model
cnn_model = create_cnn_model((32, 32, 3), 10)
cnn_model.compile(
optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy']
)
# Data augmentation
from [Link] import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True,
zoom_range=0.1
)
# GRU alternative
def create_gru_model(vocab_size, embedding_dim, max_length, num_classes):
model = [Link]([
[Link](vocab_size, embedding_dim,
input_length=max_length),
[Link](128, return_sequences=True),
[Link](64),
[Link](num_classes, activation='softmax')
])
return model
[Link](
optimizer=[Link](learning_rate=0.001),
loss='categorical_crossentropy',
metrics=['accuracy']
)
# Define model
class NeuralNetwork([Link]):
def __init__(self, input_size, hidden_sizes, output_size):
super(NeuralNetwork, self).__init__()
layers_list = []
prev_size = input_size
layers_list.append([Link](prev_size, output_size))
[Link] = [Link](*layers_list)
# Create model
model = NeuralNetwork(784, [128, 64], 10)
# Training loop
def train(model, train_loader, criterion, optimizer, epochs=10):
[Link]()
for epoch in range(epochs):
total_loss = 0
for batch_x, batch_y in train_loader:
optimizer.zero_grad()
outputs = model(batch_x)
loss = criterion(outputs, batch_y)
[Link]()
[Link]()
total_loss += [Link]()
# CNN in PyTorch
class CNN([Link]):
def __init__(self):
super(CNN, self).__init__()
self.conv_layers = [Link](
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.BatchNorm2d(32),
[Link](),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
[Link](),
nn.MaxPool2d(2)
)
self.fc_layers = [Link](
[Link](),
[Link](64 * 8 * 8, 256),
[Link](),
[Link](0.5),
[Link](256, 10)
)
# Basic operations
gray = [Link](img, cv2.COLOR_BGR2GRAY)
resized = [Link](img, (224, 224))
rotated = [Link](img, cv2.ROTATE_90_CLOCKWISE)
# Image filtering
blurred = [Link](img, (5, 5), 0)
edges = [Link](gray, 100, 200)
# Thresholding
_, binary = [Link](gray, 127, 255, cv2.THRESH_BINARY)
adaptive = [Link](gray, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
# Contour detection
contours, hierarchy = [Link](
binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
# Draw on image
img_copy = [Link]()
[Link](img_copy, contours, -1, (0, 255, 0), 2)
[Link](img_copy, (100, 100), (300, 300), (255, 0, 0), 2)
[Link](img_copy, (200, 200), 50, (0, 0, 255), -1)
[Link](img_copy, 'Hello', (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
# Video processing
cap = [Link](0) # webcam
while True:
ret, frame = [Link]()
if not ret:
break
# Process frame
gray_frame = [Link](frame, cv2.COLOR_BGR2GRAY)
[Link]('Video', frame)
if [Link](1) & 0xFF == ord('q'):
break
[Link]()
[Link]()
# Inference on image
results = model('[Link]')
# Process results
for result in results:
boxes = [Link]
for box in boxes:
x1, y1, x2, y2 = [Link][0].cpu().numpy()
confidence = [Link][0].cpu().numpy()
class_id = int([Link][0].cpu().numpy())
class_name = [Link][class_id]
print(f"{class_name}: {confidence:.2f}")
# 2. Create [Link]
# path: ./dataset
# train: train/images
# val: val/images
# nc: 5 # number of classes
# names: ['class1', 'class2', 'class3', 'class4', 'class5']
# 3. Train
model = YOLO('[Link]')
results = [Link](
data='[Link]',
epochs=100,
imgsz=640,
batch=16,
device=0 # GPU
)
# Encoder
c1 = layers.Conv2D(64, 3, activation='relu', padding='same')(inputs)
c1 = layers.Conv2D(64, 3, activation='relu', padding='same')(c1)
p1 = layers.MaxPooling2D()(c1)
# Bridge
c4 = layers.Conv2D(512, 3, activation='relu', padding='same')(p3)
c4 = layers.Conv2D(512, 3, activation='relu', padding='same')(c4)
# Decoder
u5 = layers.UpSampling2D()(c4)
u5 = [Link]([u5, c3])
c5 = layers.Conv2D(256, 3, activation='relu', padding='same')(u5)
c5 = layers.Conv2D(256, 3, activation='relu', padding='same')(c5)
u6 = layers.UpSampling2D()(c5)
u6 = [Link]([u6, c2])
c6 = layers.Conv2D(128, 3, activation='relu', padding='same')(u6)
c6 = layers.Conv2D(128, 3, activation='relu', padding='same')(c6)
u7 = layers.UpSampling2D()(c6)
u7 = [Link]([u7, c1])
c7 = layers.Conv2D(64, 3, activation='relu', padding='same')(u7)
c7 = layers.Conv2D(64, 3, activation='relu', padding='same')(c7)
# cfg = get_cfg()
# cfg.merge_from_file(model_zoo.get_config_file(
# "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
# ))
# [Link] = model_zoo.get_checkpoint_url(
# "COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml"
# )
# predictor = DefaultPredictor(cfg)
# outputs = predictor(image)
text = "The quick brown foxes are jumping over the lazy dogs! They're
having fun."
# Lowercase
text_lower = [Link]()
# Remove punctuation
text_clean = [Link](r'[^\w\s]', '', text_lower)
# Tokenization
tokens = word_tokenize(text_clean)
sentences = sent_tokenize(text)
# Remove stopwords
stop_words = set([Link]('english'))
filtered_tokens = [w for w in tokens if w not in stop_words]
# Stemming
stemmer = PorterStemmer()
stemmed = [[Link](w) for w in filtered_tokens]
# Lemmatization
lemmatizer = WordNetLemmatizer()
lemmatized = [[Link](w) for w in filtered_tokens]
print(f"Original: {tokens}")
print(f"Filtered: {filtered_tokens}")
print(f"Stemmed: {stemmed}")
print(f"Lemmatized: {lemmatized}")
documents = [
"Machine learning is a subset of artificial intelligence",
"Deep learning uses neural networks with many layers",
"Natural language processing deals with text data"
]
# Bag of Words
count_vec = CountVectorizer()
bow_matrix = count_vec.fit_transform(documents)
print("Vocabulary:", count_vec.get_feature_names_out())
# TF-IDF
tfidf_vec = TfidfVectorizer()
tfidf_matrix = tfidf_vec.fit_transform(documents)
# Train Word2Vec
w2v_model = Word2Vec(
sentences,
vector_size=100,
window=5,
min_count=1,
workers=4
)
# Similar words
similar = w2v_model.wv.most_similar('learning', topn=5)
# Sample data
texts = [
"This movie was amazing and wonderful",
"Terrible film, waste of time",
"Great acting and beautiful cinematography",
"Boring and predictable plot",
"Best movie I have ever seen",
"Disappointing ending, not recommended"
]
labels = [1, 0, 1, 0, 1, 0] # 1: positive, 0: negative
# Train-test split
X_train, X_test, y_train, y_test = train_test_split(
texts, labels, test_size=0.2, random_state=42
)
[Link](X_train, y_train)
predictions = [Link](X_test)
print(classification_report(y_test, predictions))
# Tokenization
tokenizer = Tokenizer(num_words=10000, oov_token='<OOV>')
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
padded = pad_sequences(sequences, maxlen=100, padding='post')
# Build model
model = [Link]([
[Link](10000, 128, input_length=100),
[Link]([Link](64)),
[Link](32, activation='relu'),
[Link](0.5),
[Link](1, activation='sigmoid')
])
[Link](optimizer='adam', loss='binary_crossentropy',
metrics=['accuracy'])
# Question answering
qa_pipeline = pipeline("question-answering")
context = "Python is a programming language created by Guido van Rossum."
question = "Who created Python?"
answer = qa_pipeline(question=question, context=context)
print(answer)
# Text generation
generator = pipeline("text-generation", model="gpt2")
text = generator("AI will change the world", max_length=50)
# Tokenize
text = "This is an example sentence."
inputs = tokenizer(
text,
padding=True,
truncation=True,
max_length=128,
return_tensors="pt"
)
# Inference
with torch.no_grad():
outputs = model(**inputs)
predictions = [Link]([Link], dim=-1)
print(predictions)
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=16,
per_device_eval_batch_size=64,
warmup_steps=500,
weight_decay=0.01,
logging_dir='./logs',
)
# trainer = Trainer(
# model=model,
# args=training_args,
# train_dataset=train_dataset,
# eval_dataset=eval_dataset
# )
# [Link]()
7.1 Generative AI
# Variational Autoencoder (VAE)
from tensorflow import keras
from [Link] import layers
import tensorflow as tf
class VAE([Link]):
def __init__(self, latent_dim):
super(VAE, self).__init__()
self.latent_dim = latent_dim
# Encoder
[Link] = [Link]([
[Link](256, activation='relu'),
[Link](128, activation='relu'),
])
self.z_mean = [Link](latent_dim)
self.z_log_var = [Link](latent_dim)
# Decoder
[Link] = [Link]([
[Link](128, activation='relu'),
[Link](256, activation='relu'),
[Link](784, activation='sigmoid')
])
def build_discriminator():
model = [Link]([
[Link](512, input_dim=784),
[Link](0.2),
[Link](0.3),
[Link](256),
[Link](0.2),
[Link](0.3),
[Link](1, activation='sigmoid')
])
return model
# Q-Learning
class QLearningAgent:
def __init__(self, state_size, action_size, lr=0.1, gamma=0.99,
epsilon=1.0):
self.q_table = [Link]((state_size, action_size))
[Link] = lr
[Link] = gamma
[Link] = epsilon
self.epsilon_decay = 0.995
self.epsilon_min = 0.01
self.action_size = action_size
# Training loop
env = [Link]('CartPole-v1')
agent = QLearningAgent(
state_size=env.observation_space.n if hasattr(env.observation_space,
'n') else 500,
action_size=env.action_space.n
)
# Scikit-learn model
from [Link] import RandomForestClassifier
model = RandomForestClassifier()
# [Link](X_train, y_train)
# Save
[Link](model, '[Link]')
# or
with open('[Link]', 'wb') as f:
[Link](model, f)
# Load
loaded_model = [Link]('[Link]')
# TensorFlow model
# [Link]('my_model.keras')
# loaded = [Link].load_model('my_model.keras')
app = FastAPI()
class PredictionInput(BaseModel):
features: list
class PredictionOutput(BaseModel):
prediction: int
probability: float
@[Link]("/predict", response_model=PredictionOutput)
async def predict(input_data: PredictionInput):
features = [Link](input_data.features).reshape(1, -1)
prediction = loaded_model.predict(features)[0]
probability = loaded_model.predict_proba(features).max()
return PredictionOutput(prediction=int(prediction),
probability=float(probability))
# Docker deployment
# Dockerfile:
# FROM python:3.9-slim
# WORKDIR /app
# COPY [Link] .
# RUN pip install -r [Link]
# COPY . .
# CMD ["uvicorn", "main:app", "--host", "[Link]", "--port", "8000"]
# Set experiment
mlflow.set_experiment("my_classification_experiment")
# Start run
with mlflow.start_run():
# Log parameters
mlflow.log_param("n_estimators", 100)
mlflow.log_param("max_depth", 10)
# Train model
model = RandomForestClassifier(n_estimators=100, max_depth=10)
# [Link](X_train, y_train)
# Log metrics
# accuracy = [Link](X_test, y_test)
# mlflow.log_metric("accuracy", accuracy)
# Log model
[Link].log_model(model, "model")
# Log artifacts
# mlflow.log_artifact("feature_importance.png")