TinTinDo commited on
Commit
662d38c
·
verified ·
1 Parent(s): 0570fc8

Upload 3 files

Browse files

Update 3 Files: Linear Regression , Logistic Regression, Support Vector Machine

Linear_Regression.py ADDED
@@ -0,0 +1,163 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Hồi quy tuyến tính đơn giản
2
+ import numpy as np
3
+
4
+ # Dữ liệu y = 2x + 1
5
+ x = np.array([1,2,3,4,5])
6
+ y = np.array([3,5,7,9,11])
7
+
8
+ # Tính hệ số w và b theo công thức thống kê
9
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
10
+ b = y.mean() - w * x.mean()
11
+
12
+ # Dự đoán
13
+ y_pred = w * x + b
14
+
15
+ print(f"Phương trình: y= {w: .1f}x + {b: .1f}")
16
+ print(f"Dự đoán:", y_pred)
17
+
18
+
19
+ # Vẽ đồ thị Linear Regression để trực quan hóa
20
+ # Hồi quy tuyến tính đơn giản + vẽ biểu đồ
21
+ import numpy as np
22
+ import matplotlib.pyplot as plt
23
+
24
+ # Dữ liệu y = 2x + 1
25
+ x = np.array([1,2,3,4,5])
26
+ y = np.array([3,5,7,9,11])
27
+
28
+ # Tính hệ số hồi quy
29
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean()) ** 2)
30
+ b = y.mean() - w * x.mean()
31
+
32
+ # Dự đoán
33
+ y_pred = w * x + b
34
+
35
+ # In ra kết quả
36
+ print(f"Phương trình hồi quy: y={w: .1f}x + {b: .1f}")
37
+
38
+ # Vẽ biểu đồ
39
+ plt.scatter(x,y, color='blue', label='Dữ liệu thật')
40
+ plt.plot(x,y_pred, color='red', label='Đường hồi quy')
41
+ plt.xlabel('x axis')
42
+ plt.ylabel('y axis')
43
+ plt.title('Hồi quy tuyến tính đơn giản + Trực quan hóa')
44
+ plt.legend()
45
+ plt.show()
46
+
47
+ # Luyện tập
48
+ # 1. Tuyến tính nhưng đổi hệ số khác
49
+ import numpy as np
50
+ # Dữ liệu y = 4x - 3
51
+ x = np.array([1,2,3,4,5,6,7])
52
+ y = np.array([1,5,9,13,17,21,25]) # y = 4x - 3
53
+ # Tính hệ số w và b theo công thức thống kê
54
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
55
+ b = y.mean() - w * x.mean()
56
+ # Dự đoán
57
+ y_predict = w * x + b
58
+ print(f"Phương trình y= {w: .0f}x + {b: .0f}")
59
+ print(f"Dự đoán:", y_predict)
60
+ # Vẽ đồ thị để trực quan hóa
61
+ import matplotlib.pyplot as plt
62
+ plt.scatter(x,y, color='black', label='Real Data')
63
+ plt.plot(x, y_predict, color='red', label='Predicted Data')
64
+ plt.xlabel('X - Axis')
65
+ plt.ylabel('Y - Axis')
66
+ plt.title('Linear Regression (4x - 3)')
67
+ plt.legend()
68
+ plt.show()
69
+
70
+ # 2. Tuyến tính có nhiễu(noise) thực tế hơn
71
+ # Công thức y = 3x + 2 + noise
72
+ import numpy as np
73
+ import matplotlib.pyplot as plt
74
+ # Dữ liệu 3x + 2 + noise
75
+ np.random.seed(0)
76
+ x = np.arange(1,11)
77
+ y = 3 * x + 2 + np.random.randn(10) * 2 # thêm nhiễu ngẫu nhiên
78
+ # Tính hệ số w và b theo công thức thống kê
79
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
80
+ b = y.mean() - w * x.mean()
81
+ # Dự đoán
82
+ y_predict = w * x + b
83
+ print(f"Phương trình + nhiễu: y = {w: .1f}x + {b: .1f}")
84
+ print(f"Dự đoán chính xác:", y_predict)
85
+ # Vẽ đồ thị trực quan hóa với nhiễu
86
+ plt.scatter(x,y, color='blue', label='Real Data + Noise')
87
+ plt.plot(x,y_predict, color='red', label='Predicted Data + Noise')
88
+ plt.xlabel('X - Axis')
89
+ plt.ylabel('Y - Axis')
90
+ plt.title('Linear Regression AND Noise')
91
+ plt.legend()
92
+ plt.show()
93
+
94
+ # 3. Tuyến tính nghịch (hệ số âm)
95
+ # Công thức y = -2x + 10
96
+ import numpy as np
97
+ import matplotlib.pyplot as plt
98
+ # Dữ liệu tuyến tính nghịch
99
+ x = np.array([1,2,3,4,5,6])
100
+ y = np.array([8,6,4,2,0,-2])
101
+ # Tính hệ số w và b theo công thức thống kê
102
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
103
+ b = y.mean() - w * x.mean()
104
+ # Dự đoán chính xác
105
+ y_pred = w * x + b
106
+ print(f"Phương trình tuyến tính nghịch: y = {w: .0f}x + {b: .0f}")
107
+ print(f"Dự đoán chính xác:", y_pred)
108
+ # Vẽ đồ thị trực quan hóa với tuyến tính nghịch
109
+ plt.scatter(x,y, color='red', label='Real Data')
110
+ plt.plot(x,y_pred, color='blue', label='Predicted Data')
111
+ plt.xlabel('X - Axis')
112
+ plt.ylabel('Y - Axis')
113
+ plt.title('Linear Regression AND Reversed')
114
+ plt.legend()
115
+ plt.show()
116
+
117
+ # 4. Không tuyến tính (để xem hồi quy tuyến tính kém thế nào)
118
+ # Công thức: y = x**2 + noise
119
+ import numpy as np
120
+ import matplotlib.pyplot as plt
121
+ # Dữ liệu không tuyến tính
122
+ np.random.seed(1)
123
+ x = np.linspace(-5,5,20) # Giải thích: .linspace(start, stop, num) với num=number là số giá trị cách đều nhau
124
+ y = x**2 + np.random.randn(20)*3 # Sinh ra 20 số ngẫu nhiên tuân theo phân phối chuẩn (Gaussian) → trung bình = 0, độ lệch chuẩn = 1; Nhân với 3 để phóng đại độ nhiễu (noise) → sai số ngẫu nhiên có độ lệch chuẩn ≈ 3 → càng nhân lớn, dữ liệu càng "rải" quanh đường parabol. y là giá trị theo hàm bậc hai, có thêm nhiễu ngẫu nhiên để giống dữ liệu thật. Đây là mối quan hệ phi tuyến tính giữa x và y.
125
+ # Tính hệ số w và b theo công thức thống kê
126
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
127
+ b = y.mean() - w * x.mean()
128
+ # Dự đoán chính xác
129
+ y_pred = w * x + b
130
+ print(f"Phương trình không tuyến tính: y={w: 1f}x + {b: .1f}")
131
+ print(f"Dự đoán chính xác:", y_pred)
132
+ # Vẽ đồ thị để trực quan hóa không tuyến tính
133
+ plt.scatter(x,y, color='red', label='Real Data with no linear')
134
+ plt.plot(x,y_pred, color='blue', label='Predicted Data with no linear')
135
+ plt.xlabel('X - Axis')
136
+ plt.ylabel('Y - Axis')
137
+ plt.title(' No Linear Regression')
138
+ plt.legend()
139
+ plt.show()
140
+
141
+ # 5. Dữ liệu ngẫu nhiên để luyện hiểu độ phù hợp (low R**2)
142
+ import numpy as np
143
+ import matplotlib.pyplot as plt
144
+ # Dữ liệu ngẫu nhiên
145
+ np.random.seed(2)
146
+ x = np.random.randint(1,100,20) # Giải thích: np.random.randint(low,high,size) với size là tổng số ptử muốn tạo ra
147
+ y = np.random.randint(1,100,20)
148
+
149
+ # Tính hệ số w và b theo công thức thống kê
150
+ w = np.sum((x - x.mean()) * (y - y.mean())) / np.sum((x - x.mean())**2)
151
+ b = y.mean() - w * x.mean()
152
+ # Dự đoán chính xác
153
+ y_pred = w * x + b
154
+ print(f"Phương trình tuyến tính + Random Data: y={w: 1f}x + {b: .1f}")
155
+ print(f"Dự đoán chính xác:", y_pred)
156
+ # Vẽ đồ thị để trực quan hóa không tuyến tính
157
+ plt.scatter(x,y, color='red', label='Real Data + Random')
158
+ plt.plot(x,y_pred, color='blue', label='Predicted Data + Random')
159
+ plt.xlabel('X - Axis')
160
+ plt.ylabel('Y - Axis')
161
+ plt.title('Linear Regression With Random Data')
162
+ plt.legend()
163
+ plt.show()
Logistic_Regression.py ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+ Logistic Regression là một mô hình học có giám sát (supervised learning) dùng cho bài toán phân loại (classification).
3
+ Nó dựa trên Linear Regression, nhưng thay vì dự đoán giá trị liên tục → nó biến đầu ra thành xác suất (0–1) bằng hàm sigmoid.
4
+
5
+ 🧠 2. CÔNG THỨC TOÁN HỌC
6
+ 2.1. Linear part
7
+ Trước hết, ta tính tổng có trọng số:
8
+ z = w0 + w1x1 + w2x2 + w3x3 + ... + wnxn
9
+ 2.2 Áp dụng hàm Sigmoid
10
+ y^ = σ(z) = 1 / 1 + e^-z
11
+ => Kết quả y^ nằm trong khoảng (0,1) hiểu là xác xuất đối tượng thuộc lớp 1.
12
+
13
+ 📊 3. QUYẾT ĐỊNH PHÂN LOẠI
14
+ Nếu:
15
+ y^ >= 0.5 ==> dự đoán 1
16
+ y^ < 0.5 ==> dự đoán 0
17
+
18
+ ⚙️ 4. HÀM MẤT MÁT (LOSS FUNCTION)
19
+ Ta dùng Binary Cross-Entropy Loss (Log Loss):
20
+ J(w) = -1/m ∑[y^(i)log(y^^(i)) + (1-y^(i))log(1-y^^(i))]
21
+ Mục tiêu: tối thiểu hóa J(w) → tìm bộ trọng số w tốt nhất.
22
+
23
+ 5. QUÁ TRÌNH HỌC (TRAINING)
24
+ Dùng Gradient Descent để cập nhật trọng số:
25
+ w := w - α * ∂J/∂w # Trong đó: α là learning rate.
26
+ '''
27
+
28
+ # 💻 6. CODE MẪU PYTHON
29
+ # Thư viện sử dụng cho Logistic Regression
30
+ import numpy as np
31
+ import pandas as pd
32
+ import matplotlib.pyplot as plt
33
+ from sklearn.model_selection import train_test_split
34
+ from sklearn.linear_model import LogisticRegression
35
+ from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
36
+
37
+ # Dữ liệu ví dụ
38
+ data = pd.DataFrame({
39
+ 'hours_studied': [1,2,3,4,5,6,7,8,9,10],
40
+ 'pass_exam': [0,0,0,0,0,1,1,1,1,1]
41
+ })
42
+ X = data[['hours_studied']]
43
+ y = data['pass_exam']
44
+
45
+ # Chia dữ liệu
46
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
47
+
48
+ # Huấn luyện mô hình
49
+ model = LogisticRegression()
50
+ model.fit(X_train, y_train)
51
+
52
+ # Dự đoán
53
+ y_pred = model.predict(X_test)
54
+ print("Accuracy:", accuracy_score(y_test, y_pred))
55
+ print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
56
+ print("Classification Report:\n", classification_report(y_test, y_pred))
57
+
58
+ # 📈 Ứng dụng thực tế của Logistic Regression
59
+ '''
60
+ Lĩnh vực Ứng dụng
61
+ y học Dự đoán bệnh(có/không)
62
+ Email Phân loại spam/không spam
63
+ Marketing Khách hàng mua/không mua
64
+ Tài chính Dự đoán vỡ nợ/không vỡ nợ
65
+ Nhận dạng Có khuôn mặt/không có khuôn mặt
66
+ '''
67
+
68
+ # 🧠 Trực quan hóa hàm Sigmoid
69
+ z = np.linspace(-10, 10, 100)
70
+ sigmoid = 1 / (1 + np.exp(-z))
71
+ plt.plot(z, sigmoid)
72
+ plt.title('Sigmoid Function')
73
+ plt.xlabel('z')
74
+ plt.ylabel('σ(z)')
75
+ plt.grid()
76
+ plt.show()
77
+ ''' → Đồ thị cong từ 0 → 1, giúp chuyển hóa giá trị tuyến tính thành xác suất. '''
78
+
79
+ '''
80
+ 🧩 9. ƯU ĐIỂM & NHƯỢC ĐIỂM
81
+ ✅ Ưu điểm
82
+ Đơn giản, dễ huấn luyện
83
+ Dễ hiểu, giải thích rõ ràng
84
+ Hiệu quả cho dữ liệu tuyến tính
85
+ ⚠️ Nhược điểm
86
+ Kém hiệu quả với dữ liệu phi tuyến
87
+ Không xử lý tốt nhiều lớp phức tạp (multi-class → phải dùng One-vs-Rest)
88
+ Giả định quan hệ tuyến tính giữa biến độc lập và log-odds
89
+ 🧪 10. MỞ RỘNG
90
+ Multinomial Logistic Regression → cho phân loại nhiều lớp
91
+ Regularization (L1, L2) → chống overfitting
92
+ Feature scaling → nên chuẩn hóa dữ liệu trước khi huấn luyện
93
+ '''
94
+
95
+ # 🚀 Ứng dụng Nhỏ- Dự Đoán xác xuất Thi Đậu
96
+ hours = np.array([[7]])
97
+ pred = model.predict_proba(hours)
98
+ print(f"Xác suất đậu: {pred[0][1]*100:.2f}%")
99
+
100
+ # 🧩 12. SO SÁNH VỚI LINEAR REGRESSION
101
+ '''
102
+ Đặc điểm Linear Regression Logistic Regression
103
+ Đầu ra Giá trị liên tục Xác suất (0–1)
104
+ Bài toán Dự đoán (Regression) Phân loại (Classification)
105
+ Hàm kích hoạt Không có Sigmoid
106
+ Hàm mất mát MSE Log Loss
107
+ '''
108
+
109
+ # LOGISTIC REGRESSION (Dùng thư viện đơn giản)
110
+ import numpy as np
111
+ import matplotlib.pyplot as plt
112
+
113
+ # Set up styling for Matplotlib
114
+ plt.style.use('ggplot')
115
+
116
+ # Create dataset
117
+ dataset = np.array([
118
+ [-10, 0],
119
+ [-5, 0],
120
+ [-7, 0],
121
+ [0, 0],
122
+ [-2, 0],
123
+ [5, 1],
124
+ [7, 1],
125
+ [6, 1],
126
+ [10, 1],
127
+ [15, 1],
128
+ [9, 1]
129
+ ])
130
+
131
+ # Draw the dataset
132
+ negative_class = dataset[:5]
133
+ positive_class = dataset[5:]
134
+
135
+ # Draw the negative first and positive
136
+ plt.scatter(negative_class[:, 0], negative_class[:, 1], c='y', label='Class 0')
137
+ plt.scatter(positive_class[:, 0], positive_class[:, 1], c='g', label='Class 1')
138
+ plt.legend()
139
+ plt.show()
140
+
141
+
142
+ # -------------------- Logistic Regression Functions --------------------
143
+ def get_prediction(m, b, x):
144
+ """
145
+ Get the predictions: y_hat using the input
146
+ """
147
+ return 1 / (1 + np.exp(-(m * x + b))) # ✅ Sửa công thức sigmoid
148
+
149
+
150
+ def get_cost(y, y_hat):
151
+ """
152
+ Get the value of the cost function
153
+ """
154
+ k = y.shape[0]
155
+ return (-1 / k) * np.sum(y * np.log(y_hat) + (1 - y) * np.log(1 - y_hat))
156
+
157
+
158
+ def get_gradient(m, b, x, y, y_hat):
159
+ """
160
+ Return the gradient of the loss function w.r.t m and b
161
+ """
162
+ k = y.shape[0]
163
+ dm = (1 / k) * np.sum((y_hat - y) * x)
164
+ db = (1 / k) * np.sum(y_hat - y)
165
+ return dm, db
166
+
167
+
168
+ def get_accuracy(y, y_hat):
169
+ return ((y_hat >= 0.5).astype(int) == y).sum() / y.shape[0] # ✅ Sửa chia đúng mẫu
170
+
171
+
172
+ # -------------------- Gradient Descent --------------------
173
+ m = 1.0
174
+ b = 10.0
175
+ iterations = 200
176
+ lr = 0.03
177
+ x = dataset[:, 0]
178
+ y = dataset[:, 1]
179
+ costs = []
180
+
181
+ for it in range(iterations):
182
+ y_hat = get_prediction(m, b, x)
183
+ cost = get_cost(y, y_hat)
184
+ accuracy = get_accuracy(y, y_hat)
185
+ print(f"Iteration {it} - Cost: {cost:.4f}, Accuracy: {accuracy:.4f}")
186
+
187
+ dm, db = get_gradient(m, b, x, y, y_hat) # ✅ Sửa dn → db
188
+ m -= lr * dm
189
+ b -= lr * db
190
+ costs.append(cost)
191
+
192
+ # Plot cost over iterations
193
+ plt.plot(costs)
194
+ plt.xlabel("Iteration")
195
+ plt.ylabel("Cost")
196
+ plt.title("Cost Function over Time")
197
+ plt.show()
Support_Vector_Machine.py ADDED
@@ -0,0 +1,145 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ '''
2
+ 🧠 1. SVM là gì?
3
+ SVM là một thuật toán phân loại (classification) trong Machine Learning.
4
+ Nó tìm ra một đường ranh giới (hyperplane) để phân tách các nhóm dữ liệu khác nhau.
5
+
6
+ Ví dụ:
7
+ Nếu dữ liệu có 2 lớp (A và B), SVM tìm đường thẳng (2D) hoặc mặt phẳng (3D) sao cho:
8
+ Hai nhóm tách nhau rõ nhất.
9
+ Khoảng cách (margin) từ ranh giới đến điểm gần nhất của mỗi nhóm là lớn nhất.
10
+ '''
11
+
12
+ '''
13
+ 🧩 2. Ý tưởng trực quan
14
+ Hãy tưởng tượng:
15
+ Bạn có hai nhóm điểm đỏ 🔴 và xanh 🔵.
16
+ Có nhiều cách vẽ đường thẳng chia 2 nhóm này.
17
+ SVM chọn đường chia có khoảng cách xa nhất với cả hai nhóm.
18
+ 👉 Vì khoảng cách lớn → mô hình tổng quát tốt → ít lỗi khi gặp dữ liệu mới.
19
+ '''
20
+
21
+ '''
22
+ ⚖️ 3. Khi dữ liệu bị lẫn (không tách được thẳng)
23
+ Nếu các điểm bị xen kẽ (không thể chia bằng đường thẳng),
24
+ SVM dùng kernel trick để:
25
+ “Nâng dữ liệu lên không gian cao hơn”
26
+ Ở đó, có thể tìm được đường chia tuyến tính dễ hơn.
27
+ '''
28
+
29
+ '''
30
+ 🧮 4. Tham số quan trọng
31
+ | Tham số | Ý nghĩa | Cách chọn |
32
+ | ---------- | ------------------------------------- | ---------------------------------------------- |
33
+ | C | Cân bằng giữa “ít lỗi” và “biên rộng” | Bắt đầu với 1, rồi thử 0.1 → 10 |
34
+ | kernel | Kiểu ranh giới | `'linear'` (đường thẳng) hoặc `'rbf'` ( đường cong) |
35
+ | gamma | Mức “uốn cong” khi dùng RBF kernel | Giá trị nhỏ = biên mềm, lớn = biên sát dữ liệu |
36
+ '''
37
+
38
+ # 🧰 5. Cách dùng trong Python
39
+ from sklearn.svm import SVC
40
+ from sklearn.preprocessing import StandardScaler
41
+ from sklearn.pipeline import make_pipeline
42
+ from sklearn.model_selection import train_test_split
43
+ from sklearn.datasets import load_iris
44
+
45
+ # Dữ liệu mẫu
46
+ X, y = load_iris(return_X_y=True)
47
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
48
+
49
+ # Tạo mô hình SVM
50
+ model = make_pipeline(StandardScaler(), SVC(kernel='rbf', C=1, gamma='scale')) # thử đổi kernel bằng linear, poly, sigmoid và Tinh chỉnh C và gamma: SVC(C=10, gamma=0.1)
51
+
52
+ # Huấn luyện
53
+ model.fit(X_train, y_train)
54
+
55
+ # Đánh giá
56
+ print("Độ chính xác:", model.score(X_test, y_test))
57
+
58
+ '''
59
+ ✅ Giải thích:
60
+ StandardScaler() → chuẩn hóa dữ liệu (rất quan trọng)
61
+ SVC() → SVM classifier
62
+ kernel='rbf' → chọn ranh giới cong
63
+ C và gamma → điều chỉnh độ khớp của mô hình
64
+ '''
65
+ '''
66
+ 📈 6. Khi nào nên dùng SVM?
67
+ ✅ Khi:
68
+ Dữ liệu vừa phải (không quá lớn)
69
+ Rõ ràng giữa các lớp
70
+ Muốn mô hình mạnh, chính xác
71
+
72
+ ❌ Tránh:
73
+ Dữ liệu cực lớn (hàng trăm ngàn mẫu)
74
+ Cần mô hình dễ giải thích
75
+ '''
76
+ '''
77
+ 7. Ứng dụng thực tế
78
+ Email spam / không spam
79
+ Ảnh có mèo / không mèo
80
+ Dự đoán bệnh / không bệnh
81
+ Nhận diện khuôn mặt (Face Recognition)
82
+ Nhận diện vật thể (Object Classification)
83
+ Nhận dạng chữ viết tay (Handwritten Digit Recognition)
84
+ Phân loại văn bản (Text Classification)
85
+ Nhận dạng cảm xúc (Sentiment Analysis)
86
+ Phân loại tế bào ung thư (Cancer Cell Classification)
87
+ Dự đoán hoạt động gen hoặc protein
88
+ Phát hiện gian lận thẻ tín dụng (Fraud Detection)
89
+ Dự đoán rủi ro tín dụng (Credit Risk Scoring)
90
+ Phân loại tín hiệu thị trường chứng khoán (Up / Down)
91
+ Nhận dạng vật cản / đường đi cho robot tự hành
92
+ Dự đoán sự cố thiết bị (predictive maintenance)
93
+ Kiểm tra chất lượng sản phẩm (Quality Control)
94
+ Phân tích quy trình (Process Optimization)
95
+ '''
96
+
97
+ # ️ Mini Project thực tế với tập dữ liệu data.csv
98
+ import pandas as pd
99
+ import numpy as np
100
+ import matplotlib.pyplot as plt
101
+ from sklearn.svm import SVC
102
+ from sklearn.preprocessing import StandardScaler
103
+ from sklearn.model_selection import train_test_split
104
+ from sklearn.pipeline import make_pipeline
105
+
106
+ # 1. Đọc dữ liệu
107
+ data = pd.read_csv(r"C:\Users\Microsoft\Machine-Learning-Tutorial\data.csv")
108
+
109
+ # 2. Lấy đặc trưng và nhãn
110
+ X = data.iloc[:, :-1].values # tất cả cột trừ cột cuối
111
+ y = data.iloc[:, -1].values # cột cuối là label
112
+
113
+ # (Chỉ vẽ được nếu dữ liệu có đúng 2 cột feature)
114
+ if X.shape[1] != 2:
115
+ raise ValueError("⚠️ Dữ liệu phải có đúng 2 cột đặc trưng để vẽ biểu đồ 2D!")
116
+
117
+ # 3. Chia tập train/test
118
+ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
119
+
120
+ # 4. Tạo model SVM (dùng RBF)
121
+ model = make_pipeline(StandardScaler(), SVC(kernel="rbf", C=1, gamma=0.5))
122
+ model.fit(X_train, y_train)
123
+
124
+ # 5. Độ chính xác
125
+ acc = model.score(X_test, y_test)
126
+ print(f"✅ Độ chính xác trên tập test: {acc:.2f}")
127
+
128
+ # 6. Tạo lưới để vẽ ranh giới
129
+ x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
130
+ y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
131
+ xx, yy = np.meshgrid(np.linspace(x_min, x_max, 300),
132
+ np.linspace(y_min, y_max, 300))
133
+
134
+ # Dự đoán cho từng điểm trong lưới
135
+ Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
136
+ Z = Z.reshape(xx.shape)
137
+
138
+ # 7. Vẽ biểu đồ
139
+ plt.figure(figsize=(8,6))
140
+ plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.coolwarm)
141
+ plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.coolwarm, edgecolors='k')
142
+ plt.title(f"SVM Decision Boundary (accuracy = {acc:.2f})")
143
+ plt.xlabel("Feature 1")
144
+ plt.ylabel("Feature 2")
145
+ plt.show()