Machine Learning with Python
Learn Machine Learning with hands-on Python tutorials, real-world code examples, and clear explanations for researchers and developers. Admin: @HusseinSheikho || @Hussein_Sheikho
Больше📈 Аналитический обзор Telegram-канала Machine Learning with Python
Канал Machine Learning with Python (@codeprogrammer) языкового сегмента Английский является активным участником. Сейчас сообщество объединяет 68 117 подписчиков, занимая 2 370 место в категории Образование и 4 740 место в регионе Индия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 68 117 подписчиков.
Согласно последним данным от 29 августа, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило 67, а за последние 24 часа — 13, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 3.98%. В первые 24 часа после публикации контент обычно набирает 1.55% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 2 714 просмотров. В течение первых суток публикация набирает 1 053 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 6.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как insidead, learning, degree, evaluation, algorithm.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Learn Machine Learning with hands-on Python tutorials, real-world code examples, and clear explanations for researchers and developers.
Admin: @HusseinSheikho || @Hussein_Sheikho”
Благодаря высокой частоте обновлений (последние данные получены 30 августа, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Образование.
# Add these imports to the top of bot.py
import csv
import io
import database as db
async def export_members(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
"""Exports channel members to a CSV file."""
user = update.effective_user
chat = update.effective_chat
if chat.type != 'channel':
await update.message.reply_text("This command can only be used in a channel.")
return
# --- Permission Check ---
try:
admins = await context.bot.get_chat_administrators(chat.id)
is_creator = False
for admin in admins:
if admin.user.id == user.id and admin.status == 'creator':
is_creator = True
break
if not is_creator:
await update.message.reply_text("Sorry, only the channel creator can use this command.")
return
except Exception as e:
await update.message.reply_text(f"An error occurred while checking permissions: {e}")
return
await update.message.reply_text("Exporting members... This may take a moment for large channels.")
# The rest of the logic will go here in the next step
# In the main() function of bot.py, uncomment and add the handler:
# application.add_handler(CommandHandler("export", export_members))
# At the start of main(), also add the database setup call:
db.setup_database()
# Hashtags: #BotLogic #Permissions #Security #TelegramAPI
---
#Step 4: Fetching Members and Generating the CSV File
This is the continuation of the export_members function. After passing the permission check, the bot will fetch the list of administrators (as a reliable way to get some members) and generate a CSV file in memory.
NOTE: The Bot API has limitations on fetching a complete list of non-admin members in very large channels. This example reliably fetches administrators. A more advanced "userbot" would be needed to guarantee fetching all members./export command from the channel owner, exporting the list of members (Username, User ID, etc.) to a CSV file and storing a log of the action in a SQLite database.
IMPORTANT NOTE: Due to Telegram's privacy policy, bots CANNOT access users' phone numbers. This field will be marked as "N/A".
---
#Step 1: Bot Creation and Project Setup
First, create a bot via the @BotFather on Telegram. Send it the /newbot command, follow the instructions, and save the HTTP API token it gives you.
Next, set up your Python environment. Install the necessary library: python-telegram-bot.
pip install python-telegram-bot
Create a new Python file named bot.py and add the basic structure. Replace 'YOUR_TELEGRAM_API_TOKEN' with the token you got from BotFather.
import logging
from telegram import Update
from telegram.ext import Application, CommandHandler, ContextTypes
# Enable logging
logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)
TOKEN = 'YOUR_TELEGRAM_API_TOKEN'
def main() -> None:
"""Start the bot."""
application = Application.builder().token(TOKEN).build()
# We will add command handlers here in the next steps
# application.add_handler(CommandHandler("export", export_members))
print("Bot is running...")
application.run_polling()
if __name__ == "__main__":
main()
# Hashtags: #Setup #TelegramAPI #PythonBot #BotFather
---
#Step 2: Database Setup for Logging (database.py)
To fulfill the requirement of using a database, we will log every export request. Create a new file named database.py. This separates our data logic from the bot logic.
import sqlite3
from datetime import datetime
DB_NAME = 'bot_logs.db'
def setup_database():
"""Creates the database table if it doesn't exist."""
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS export_logs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
chat_id INTEGER NOT NULL,
chat_title TEXT,
requested_by_id INTEGER NOT NULL,
requested_by_username TEXT,
timestamp TEXT NOT NULL
)
''')
conn.commit()
conn.close()
def log_export_action(chat_id, chat_title, user_id, username):
"""Logs a successful export action to the database."""
conn = sqlite3.connect(DB_NAME)
cursor = conn.cursor()
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
cursor.execute(
"INSERT INTO export_logs (chat_id, chat_title, requested_by_id, requested_by_username, timestamp) VALUES (?, ?, ?, ?, ?)",
(chat_id, chat_title, user_id, username, timestamp)
)
conn.commit()
conn.close()
# Hashtags: #SQLite #DatabaseDesign #Logging #DataPersistence
---
#Step 3: Implementing the Export Command and Permission Check
Now, we'll write the core function in bot.py. This function will handle the /export command. The most crucial part is to check if the user who sent the command is the creator of the channel. This prevents any admin from exporting the data.# --- Visualization --- (This code continues inside the while loop)
# Draw the lane polygons on the frame
cv2.polylines(frame, [LANE_1_POLYGON], isClosed=True, color=(255, 255, 0), thickness=2)
cv2.polylines(frame, [LANE_2_POLYGON], isClosed=True, color=(255, 255, 0), thickness=2)
# Check for congestion and display status for Lane 1
if lane_1_count > CONGESTION_THRESHOLD:
status_1 = "CONGESTED"
color_1 = (0, 0, 255) # Red
else:
status_1 = "NORMAL"
color_1 = (0, 255, 0) # Green
cv2.putText(frame, f"Lane 1: {lane_1_count} ({status_1})", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, color_1, 2)
# Check for congestion and display status for Lane 2
if lane_2_count > CONGESTION_THRESHOLD:
status_2 = "CONGESTED"
color_2 = (0, 0, 255) # Red
else:
status_2 = "NORMAL"
color_2 = (0, 255, 0) # Green
cv2.putText(frame, f"Lane 2: {lane_2_count} ({status_2})", (530, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, color_2, 2)
# Display the frame with detections and status
cv2.imshow("Traffic Congestion Monitor", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
# Hashtags: #DataVisualization #OpenCV #TrafficFlow
---
#Step 5: Results and Discussion
When you run the script, a video window will appear. You will see:
• Yellow polygons outlining the defined lanes.
• Text at the top indicating the number of vehicles in each lane and its status ("NORMAL" or "CONGESTED").
• The status text and its color will change in real-time based on the vehicle count exceeding the CONGESTION_THRESHOLD.
Discussion of Results:
Threshold is Key: The CONGESTION_THRESHOLD is the most important variable to tune. A value of 10 might be too high for a short lane or too low for a long one. It must be calibrated based on the specific camera view and what is considered "congested" for that road.
Polygon Accuracy: The system's accuracy is highly dependent on how well you define the LANE_POLYGON coordinates. They must accurately map to the lanes in the video, accounting for perspective.
Limitations: This method only measures vehicle density (number of cars in an area). It does not measure traffic flow (vehicle speed). A lane could have many cars moving quickly (high density, but not congested) or a few stopped cars (low density, but very congested).
Potential Improvements:
Object Tracking: Implement an object tracker (like DeepSORT or BoT-SORT) to assign a unique ID to each car. This would allow you to calculate the average speed of vehicles within each lane, providing a much more reliable measure of congestion.
Time-Based Analysis: Analyze data over time. A lane that is consistently above the threshold for more than a minute is a stronger indicator of a traffic jam than a brief spike in vehicle count.
#ProjectComplete #AIforCities #Transportation
━━━━━━━━━━━━━━━
By: @CodeProgrammer ✨#Step 1: Project Setup and Dependencies
We need to install ultralytics for YOLOv8 and opencv-python for video and image processing. numpy is also essential for handling the coordinates of our detection zones.
pip install ultralytics opencv-python numpy
Create a Python script (e.g., traffic_monitor.py) and import the necessary libraries.
import cv2
import numpy as np
from ultralytics import YOLO
# Hashtags: #Setup #Python #OpenCV #YOLOv8
---
#Step 2: Model Loading and Lane Definition
We'll load a pre-trained YOLOv8 model, which is excellent at detecting common objects like cars, trucks, and buses. The most critical part of this step is defining the zones of interest (our lanes) as polygons on the video frame. You will need to adjust these coordinates to match the perspective of your specific video.
You will also need a video file, for example, traffic_video.mp4.
# Load a pre-trained YOLOv8 model (yolov8n.pt is small and fast)
model = YOLO('yolov8n.pt')
# Path to your video file
VIDEO_PATH = 'traffic_video.mp4'
# Define the polygons for two lanes.
# IMPORTANT: You MUST adjust these coordinates for your video's perspective.
# Each polygon is a numpy array of [x, y] coordinates.
LANE_1_POLYGON = np.array([[20, 400], [450, 400], [450, 250], [20, 250]], np.int32)
LANE_2_POLYGON = np.array([[500, 400], [980, 400], [980, 250], [500, 250]], np.int32)
# Define the congestion threshold. If vehicle count > this, the lane is congested.
CONGESTION_THRESHOLD = 10
# Hashtags: #Configuration #AIModel #SmartCity
---
#Step 3: Main Loop for Detection and Counting
This is the core of our program. We will loop through each frame of the video, run vehicle detection, and then check if the center of each detected vehicle falls inside our predefined lane polygons. We will keep a count for each lane.
cap = cv2.VideoCapture(VIDEO_PATH)
while cap.isOpened():
success, frame = cap.read()
if not success:
break
# Run YOLOv8 inference on the frame
results = model(frame)
# Initialize vehicle counts for each lane for the current frame
lane_1_count = 0
lane_2_count = 0
# Process detection results
for r in results:
for box in r.boxes:
# Check if the detected object is a vehicle
class_id = int(box.cls[0])
class_name = model.names[class_id]
if class_name in ['car', 'truck', 'bus', 'motorbike']:
# Get bounding box coordinates
x1, y1, x2, y2 = map(int, box.xyxy[0])
# Calculate the center point of the bounding box
center_x = (x1 + x2) // 2
center_y = (y1 + y2) // 2
# Check if the center point is inside Lane 1
if cv2.pointPolygonTest(LANE_1_POLYGON, (center_x, center_y), False) >= 0:
lane_1_count += 1
# Check if the center point is inside Lane 2
elif cv2.pointPolygonTest(LANE_2_POLYGON, (center_x, center_y), False) >= 0:
lane_2_count += 1
# Hashtags: #RealTime #ObjectDetection #VideoProcessing
(Note: The code below should be placed inside the while loop of Step 3)
---
#Step 4: Visualization and Displaying Results# Initialize the TF-IDF Vectorizer
vectorizer = TfidfVectorizer()
# Fit the vectorizer on the training data and transform it
X_train_tfidf = vectorizer.fit_transform(X_train)
# Only transform the test data using the already-fitted vectorizer
X_test_tfidf = vectorizer.transform(X_test)
print("Shape of training data vectors:", X_train_tfidf.shape)
print("Shape of testing data vectors:", X_test_tfidf.shape)
---
Step 5: Training the NLP Model
Now we can train a machine learning model. Multinomial Naive Bayes is a simple yet powerful algorithm that works very well for text classification tasks.
#ModelTraining #NaiveBayes
# Initialize and train the Naive Bayes classifier
model = MultinomialNB()
model.fit(X_train_tfidf, y_train)
print("Model training complete.")
---
Step 6: Making Predictions and Evaluating the Model
With our model trained, let's use it to make predictions on our unseen test data and see how well it performs.
#Evaluation #ModelPerformance #Prediction
# Make predictions on the test set
y_pred = model.predict(X_test_tfidf)
# Calculate accuracy
accuracy = accuracy_score(y_test, y_pred)
print(f"Model Accuracy: {accuracy * 100:.2f}%\n")
# Display a detailed classification report
print("Classification Report:")
print(classification_report(y_test, y_pred, target_names=['Negative', 'Positive']))
---
Step 7: Discussion of Results
#Results #Discussion
Our model achieved 100% accuracy on this very small test set.
Accuracy: This is the percentage of correct predictions. 100% is perfect, but this is expected on such a tiny, clean dataset. In the real world, an accuracy of 85-95% is often considered very good.
Precision: Of all the times the model predicted "Positive", what percentage were actually positive?
Recall: Of all the actual "Positive" texts, what percentage did the model correctly identify?
F1-Score: A weighted average of Precision and Recall.
Limitations: Our dataset is extremely small. A real model would need thousands of examples to be reliable and generalize well to new, unseen text.
---
Step 8: Testing the Model on New Sentences
Let's see how our complete pipeline works on brand new text.
#RealWorldNLP #Inference
# Function to predict sentiment of a new sentence
def predict_sentiment(sentence):
# 1. Preprocess the text
processed_sentence = preprocess_text(sentence)
# 2. Vectorize the text using the SAME vectorizer
vectorized_sentence = vectorizer.transform([processed_sentence])
# 3. Make a prediction
prediction = model.predict(vectorized_sentence)
# 4. Return the result
return "Positive" if prediction[0] == 1 else "Negative"
# Test with new sentences
new_sentence_1 = "The movie was absolutely amazing!"
new_sentence_2 = "I was very bored and did not like it."
print(f"'{new_sentence_1}' -> Sentiment: {predict_sentiment(new_sentence_1)}")
print(f"'{new_sentence_2}' -> Sentiment: {predict_sentiment(new_sentence_2)}")
━━━━━━━━━━━━━━━
By: @CodeProgrammer ✨# Imports and Data
import re
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
import nltk
from nltk.corpus import stopwords
# You may need to download stopwords for the first time
# nltk.download('stopwords')
# Sample Data (In a real project, load this from a file)
texts = [
"I love this movie, it's fantastic!",
"This was a terrible film.",
"The acting was superb and the plot was great.",
"I would not recommend this to anyone.",
"It was an okay movie, not the best but enjoyable.",
"Absolutely brilliant, a must-see!",
"A complete waste of time and money.",
"The story was compelling and engaging."
]
# Labels: 1 for Positive, 0 for Negative
labels = [1, 0, 1, 0, 1, 1, 0, 1]
---
Step 2: Text Preprocessing
Computers don't understand words, so we must clean and process our text data first. This involves making text lowercase, removing punctuation, and filtering out common "stop words" (like 'the', 'a', 'is') that don't add much meaning.
#TextPreprocessing #DataCleaning
# Text Preprocessing Function
stop_words = set(stopwords.words('english'))
def preprocess_text(text):
# Make text lowercase
text = text.lower()
# Remove punctuation
text = re.sub(r'[^\w\s]', '', text)
# Tokenize and remove stopwords
tokens = text.split()
filtered_tokens = [word for word in tokens if word not in stop_words]
return " ".join(filtered_tokens)
# Apply preprocessing to our dataset
processed_texts = [preprocess_text(text) for text in texts]
print("--- Original vs. Processed ---")
for i in range(3):
print(f"Original: {texts[i]}")
print(f"Processed: {processed_texts[i]}\n")
---
Step 3: Splitting the Data
We must split our data into a training set (to teach the model) and a testing set (to evaluate its performance on unseen data).
#MachineLearning #TrainTestSplit
# Splitting data into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(
processed_texts,
labels,
test_size=0.25, # Use 25% of data for testing
random_state=42 # for reproducibility
)
print(f"Training samples: {len(X_train)}")
print(f"Testing samples: {len(X_test)}")
---
Step 4: Feature Extraction (Vectorization)
We need to convert our cleaned text into a numerical format. We'll use TF-IDF (Term Frequency-Inverse Document Frequency). This technique converts text into vectors of numbers, giving more weight to words that are important to a document but not common across all documents.
#FeatureEngineering #TFIDF #Vectorization# Creating a dictionary
student = {
"name": "Alex",
"age": 21,
"courses": ["Math", "CompSci"]
}
# Accessing values
print(f"Name: {student['name']}")
print(f"Age: {student.get('age')}")
# Safe access for a non-existent key
print(f"Major: {student.get('major', 'Not specified')}")
# --- Sample Output ---
# Name: Alex
# Age: 21
# Major: Not specified
• A dictionary is created using curly braces {} with key: value pairs.
• student['name'] accesses the value using its key. This will raise a KeyError if the key doesn't exist.
• student.get('age') is a safer way to access a value, returning None if the key is not found.
• .get() can also take a second argument as a default value to return if the key is missing.
2. Modifying a Dictionary
user_profile = {
"username": "coder_01",
"level": 5
}
# Add a new key-value pair
user_profile["email"] = "coder@example.com"
print(f"After adding: {user_profile}")
# Update an existing value
user_profile["level"] = 6
print(f"After updating: {user_profile}")
# Remove a key-value pair
del user_profile["email"]
print(f"After deleting: {user_profile}")
# --- Sample Output ---
# After adding: {'username': 'coder_01', 'level': 5, 'email': 'coder@example.com'}
# After updating: {'username': 'coder_01', 'level': 6, 'email': 'coder@example.com'}
# After deleting: {'username': 'coder_01', 'level': 6}
• A new key-value pair is added using simple assignment dict[new_key] = new_value.
• The value of an existing key is updated by assigning a new value to it.
• The del keyword completely removes a key-value pair from the dictionary.
3. Looping Through Dictionaries
inventory = {
"apples": 430,
"bananas": 312,
"oranges": 525
}
# Loop through keys
print("--- Keys ---")
for item in inventory.keys():
print(item)
# Loop through values
print("\n--- Values ---")
for quantity in inventory.values():
print(quantity)
# Loop through key-value pairs
print("\n--- Items ---")
for item, quantity in inventory.items():
print(f"{item}: {quantity}")
# --- Sample Output ---
# --- Keys ---
# apples
# bananas
# oranges
#
# --- Values ---
# 430
# 312
# 525
#
# --- Items ---
# apples: 430
# bananas: 312
# oranges: 525
• .keys() returns a view object of all keys, which can be looped over.
• .values() returns a view object of all values.
• .items() returns a view object of key-value tuple pairs, allowing you to easily access both in each loop iteration.
#Python #DataStructures #Dictionaries #Programming #PythonBasics
━━━━━━━━━━━━━━━
By: @CodeProgrammer ✨from tensorflow import keras
from tensorflow.keras import layers
# Define a Sequential model
model = keras.Sequential([
# Input layer with 64 neurons, expecting flat input data
layers.Dense(64, activation="relu", input_shape=(784,)),
# A hidden layer with 32 neurons
layers.Dense(32, activation="relu"),
# Output layer with 10 neurons for 10-class classification
layers.Dense(10, activation="softmax")
])
model.summary()
• Model Definition: keras.Sequential creates a simple, layer-by-layer model.
• layers.Dense is a standard fully-connected layer. The first layer must specify the input_shape.
• activation functions like "relu" introduce non-linearity, while "softmax" is used on the output layer for multi-class classification to produce probabilities.
# (Continuing from the previous step)
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
print("Model compiled successfully.")
• Compilation: .compile() configures the model for training.
• optimizer is the algorithm used to update the model's weights (e.g., 'adam' is a popular choice).
• loss is the function the model tries to minimize during training. sparse_categorical_crossentropy is common for integer-based classification labels.
• metrics are used to monitor the training and testing steps. Here, we track accuracy.
import numpy as np
# Create dummy training data
x_train = np.random.random((1000, 784))
y_train = np.random.randint(10, size=(1000,))
# Train the model
history = model.fit(
x_train,
y_train,
epochs=5,
batch_size=32,
verbose=0 # Hides the progress bar for a cleaner output
)
print(f"Training complete. Final accuracy: {history.history['accuracy'][-1]:.4f}")
# Output (will vary):
# Training complete. Final accuracy: 0.4570
• Training: The .fit() method trains the model on your data.
• x_train and y_train are your input features and target labels.
• epochs defines how many times the model will see the entire dataset.
• batch_size is the number of samples processed before the model is updated.
# Create a single dummy sample to test
x_test = np.random.random((1, 784))
# Get the model's prediction
predictions = model.predict(x_test)
predicted_class = np.argmax(predictions[0])
print(f"Predicted class: {predicted_class}")
print(f"Confidence scores: {predictions[0].round(2)}")
# Output (will vary):
# Predicted class: 3
# Confidence scores: [0.09 0.1 0.1 0.12 0.1 0.09 0.11 0.1 0.09 0.1 ]
• Prediction: .predict() is used to make predictions on new, unseen data.
• For a classification model with a softmax output, this returns an array of probabilities for each class.
• np.argmax() is used to find the index (the class) with the highest probability score.
#Keras #TensorFlow #DeepLearning #MachineLearning #Python
━━━━━━━━━━━━━━━
By: @CodeProgrammer ✨f or F.
1. Basic Variable and Expression Embedding
name = "Alice"
quantity = 5
print(f"Hello, {name}. You have {quantity * 2} items in your cart.")
# Output: Hello, Alice. You have 10 items in your cart.
• Place variables or expressions directly inside curly braces {}. Python evaluates the expression and inserts the result into the string.
2. Number Formatting
Control the appearance of numbers, such as padding with zeros or setting decimal precision.
pi_value = 3.14159
order_id = 42
print(f"Pi: {pi_value:.2f}")
print(f"Order ID: {order_id:04d}")
# Output:
# Pi: 3.14
# Order ID: 0042
• :.2f formats the float to have exactly two decimal places.
• :04d formats the integer to be at least 4 digits long, padding with leading zeros if necessary.
3. Alignment and Padding
Align text within a specified width, which is useful for creating tables or neatly formatted output.
item = "Docs"
print(f"|{item:<10}|") # Left-aligned
print(f"|{item:^10}|") # Center-aligned
print(f"|{item:>10}|") # Right-aligned
# Output:
# |Docs |
# | Docs |
# | Docs|
• Use < for left, ^ for center, and > for right alignment, followed by the total width.
4. Date and Time Formatting
Directly format datetime objects within an f-string.
from datetime import datetime
now = datetime.now()
print(f"Current time: {now:%Y-%m-%d %H:%M}")
# Output: Current time: 2023-10-27 14:30
• Use a colon : followed by standard strftime formatting codes to display dates and times as you wish.
#Python #Programming #CodingTips #FStrings #PythonTips
━━━━━━━━━━━━━━━
By: @CodeProgrammer ✨True/False values based on a condition. Applying this mask to your original array instantly selects only the elements where the mask is True, which is significantly faster.
import numpy as np
# Create an array of data
data = np.array([10, 55, 8, 92, 43, 77, 15])
# Create a boolean mask for values greater than 50
high_values_mask = data > 50
# Use the mask to select elements
filtered_data = data[high_values_mask]
print(filtered_data)
# Output: [55 92 77]
Code explanation: A NumPy array data is created. Then, a boolean array high_values_mask is generated, which is True for every element in data greater than 50. This mask is used as an index to efficiently extract and print only those matching elements from the original array.
#Python #NumPy #DataScience #CodingTips #Programming
━━━━━━━━━━━━━━━
By: @CodeProgrammer ✨