3.4. MƠI TRƯỜNG THỰC NGHIỆM
3.4.7. Kết quả thực nghiệm 30% trên 5231 mẫu dữ liệu
Bảng 3.2. Độ chính xác dự báo trên 30% mẫu dữ liệu
Bộ dữ liệu Dự báo học lực Dự báo danh hiệu Dự báo tổ hợp mơn thi TB thời gian Bộ 1 Mẫu 1 đến 250 97.60% 97.60% 91.60% 3643.57875 Bộ 2 Mẫu 251 đến 500 91.60% 91.60% 97.60% 3394.22455 Bộ 3 Mẫu 501 đến 750 96.00% 96.00% 91.60% 3821.56515 Bộ 4 Mẫu 751 đến 1000 95.20% 95.20% 92.00% 3679.713 Bộ 5 Mẫu 1001 đến 1250 99.20% 99.20% 95.20% 3158.87446 Bộ 6 Mẫu 1251 đến 1500 92.40% 92.40% 95.20% 3904.67071 Bộ 7 Mẫu 1501 đến 1750 96.40% 96.40% 78.00% 3835.79677 Bộ 1 Bộ 2 Bộ 3 Bộ 4 Bộ 5 Bộ 6 Bộ 7 Thời gian trung bình 344.88 484.37 334.06 392.40 562.82 378.39 359.44
0.00 100.00 200.00 300.00 400.00 500.00 600.00
Hình 3.11. Mơ tả độ chính xác về học lực của học sinh
Hình 3.12 Mơ tả độ chính xác về dự báo danh hiệu cho học sinh
Hình 3.13. Mơ tả độ chính xác dự báo tổ hợp mơn thi cho học sinh
Bộ 1 Bộ 2 Bộ 3 Bộ 4 Bộ 5 Bộ 6 Bộ 7 Dự báo học lực 97.60% 91.60% 96.00% 95.20% 99.20% 92.40% 96.40% 86.00% 88.00% 90.00% 92.00% 94.00% 96.00% 98.00% 100.00% DỰ BÁO HỌC LỰC Bộ 1 Bộ 2 Bộ 3 Bộ 4 Bộ 5 Bộ 6 Bộ 7 Dự báo danh hiệu 97.60% 91.60% 96.00% 95.20% 99.20% 92.40% 96.40%
86.00% 88.00% 90.00% 92.00% 94.00% 96.00% 98.00% 100.00%
DỰ BÁO DANH HIỆU
Bộ 1 Bộ 2 Bộ 3 Bộ 4 Bộ 5 Bộ 6 Bộ 7 Dự báo tổ hợp mơn thi 91.60% 97.60% 91.60% 92.00% 95.20% 95.20% 78.00%
0.00% 20.00% 40.00% 60.00% 80.00% 100.00% 120.00%
Hình 3.14. Thời gian dự báo trung bình cho mỗi mẫu dữ liệu
3.5. TỔNG KẾT CHƯƠNG
Trong chương này, một ứng dụng thực nghiệm được xây dựng dựa trên cơ sở lý thuyết đã được đề xuất tại chương 2. Dữ liệu đầu vào là điểm của học sinh và được thu thập của nhiều năm khác nhau từ nhiều trường THPT trong địa bàn thành phố Vũng Tàu. Sau khi xử lý dữ liệu, hệ thống thực thi quá trình gom cụm theo thuật tốn K-Means để từ đĩ làm cơ sở huấn luyện cho mạng SOM. Sau đĩ, quá trình chọn cụm chiến thắng và phân lớp học sinh được thực hiện nhằm dự báo về năng lực học sinh, dự báo điểm các tổ hợp mơn KHTN và KHXN đồng thời tư vấn chọn mơn thi cho học sinh. Quá trình này được thực nghiệm trên hai bộ dữ liệu cĩ 1073 bộ và 5231 bộ để từ đĩ đánh giá kết quả. Theo như tổng hợp về kết quả thực nghiệm cho thấy, phương pháp đề xuất là hiệu quả và cĩ thể áp dụng dự báo trên nhiều bộ dữ liệu khác nhau.
Bộ 1 Bộ 2 Bộ 3 Bộ 4 Bộ 5 Bộ 6 Bộ 7 TB thời gian 3643.57883394.22453821.56523679.7133158.87453904.67073835.7968 0 500 1000 1500 2000 2500 3000 3500 4000 4500 TB THỜI GIAN
KẾT LUẬN
Trong luận văn này, một hệ tư vấn và dự báo đã được tiếp cận xây dựng nhằm tạo ra một cơng cụ hữu ích hỗ trợ cho học sinh đánh giá năng lực của mình đồng thời chọn được tổ hợp mơn phù hợp để cĩ thể thực hiện trong quá trình thi tốt nghiệp THPT. Để thực hiện xây dựng hệ tư vấn này, các phương pháp gom cụm, học bán giám sát, học khơng giám sát lần lượt được thực hiện và áp dụng cho quá trình phân lớp cũng như dự báo cho học sinh.
Hệ thống tư vấn này được chia làm hai giai đoạn bao gồm (1) thực hiện tiền xử lý dữ liệu tại server, kết quả của giai đoạn này là một tập các cụm dữ liệu học sinh cùng với các trọng số cho các cụm để cĩ thể chọn cụm chiến thắng theo nguyên lý mạng SOM; (2) thực hiện quá trình phân lớp và dự báo dựa trên việc chọn cụm chiến thắng trên mạng SOM để từ đĩ phân lớp dữ liệu theo phương pháp láng giềng gần nhất k-NN để tạo các kết quả dự báo về học lực cũng như tư vấn chọn mơn thi cho học sinh trong kỳ thi THPT Quốc gia.
Luận văn đã lần lượt tiếp cận các cơ sở lý thuyết về thuật tốn phân cụm K-Means, nguyên lý về bản đồ tự tổ chức SOM, thuật tốn phân lớp theo láng giềng gần nhất k-NN để từ đĩ kết hợp lại cho việc xây dựng một hệ tư vấn. Nội dung luận văn đã tiếp cận và thực hiện được các thành phần chính bao gồm (1) Xây dựng một mơ hình hệ dự báo và tư vấn cho học sinh THPT; (2) Tiếp cận phân cụm K-Means để phân cụm dữ liệu cho học sinh; (3) Tiếp cận mạng SOM để chọn cụm chiến thắng để từ đĩ làm dữ liệu đầu vào cho bài tốn phân lớp; (4) Áp dụng thuật tốn láng giềng gần nhất để phân lớp học sinh trên cơ sở phương pháp học bán giám sát; (5) Xây dựng thực nghiệm và áp dụng các bộ dữ liệu học sinh khác nhau trên địa bàn thành phố Vũng Tàu.
Hướng phát triển tiếp theo của luận văn này đĩ là bổ sung thêm các thuộc tính cũng như kết hợp các phương pháp phân lớp khác để đưa ra các quyết định hỗ trợ cho học sinh trong việc thi tốt nghiệp THPT Quốc gia.
TÀI LIỆU THAM KHẢO
[1]. Bộ Giáo dục và Đào tạo,Thơng tư số 02/2016/TT-BGDĐTcủa Bộ trưởng Bộ Giáo dục và Đào tạo, về việc sửa đổi, bổ sung một số điều của quy chế thi
trung học phổ thơng quốc gia, ngày 10 tháng 03 năm 2016.
[2]. Bộ Giáo dục và Đào tạo,Thơng tư số 04/2017/TT-BGDĐT của Bộ trưởng Bộ Giáo dục và Đào tạo, về việc sửa đổi, bổ sung một số điều của quy chế thi
trung học phổ thơng quốc gia, ngày 25 tháng 01 năm 2017.
[3]. Oyelade, O. J., Oladipupo, O. O., Obagbuwa, I. C. (2010), “Application of k Means Clustering algorithm for prediction of Students Academic Performance”, Inter. Journal of Computer Science and Information Security, 7(1), pp. 292-295.
[4]. Shaukat, K., Nawaz, I., Aslam, S., Zaheer, S. and Shaukat, U. (2016), “Student's performance in the context of data mining”, International Multi- Topic Conference (INMIC), IEEE, pp. 1-8.
[5].Zhongxiang Fan, Yan Sun, Hong Luo (2017), “Clustering of College Students Based on Improved K-means Algorithm”, Journal of Computers, 28(6), pp. 195-203.
[6]. Sari, I., Maseleno, A., Satria, F., & Muslihudin, M. (2018), “Application model of k-means clustering: insights into promotion strategy of vocational high school”, Inter. Journal of Engineering & Tech., 7(2.27), pp. 182-187. [7]. Lee, Y. (2019) “Using self-organizing map and clustering to investigate problem-solving patterns in the massive open online course: an exploratory study”, Journal of Educational Computing Research, 57(2), pp. 471-490. [8]. Hussain, S., Muhsion, Z. F., Salal, Y. K., Theodoru, P., KurtoÄŸlu, F., & Hazarika, G. C. (2019), “Prediction model on student performance based on internal assessment using deep learning”, International Journal of Emerging Technologies in Learning (iJET), 14(08), pp. 4-22.
[9]. Khadir, A. S. A., Amanullah, K. M., & Shankar, P. G. (2015), “Student’s academic performance analysis using SOM”, International Journal for Scientific Research and Development, 3(02), pp. 1037-1039.
[10]. Crivei, L. M., Czibula, G., Ciubotariu, G., & Dindelegan, M. (2020), “Unsupervised learning based mining of academic data sets for students’ performance analysis”, International Symposium on Applied Computational Intelligence and Informatics (SACI), IEEE, pp. 11-16.
[11]. Purbasari, I. Y., Puspaningrum, E. Y., & Putra, A. B. S. (2020),“Using Self-Organizing Map (SOM) for Clustering and Visualization of New Students based on Grades”, Journal of Physics: Conference Series, 1569(2), pp. 1-6.
[12]. Atira, N. N., Azmira, I., Bohari, Z. H., Zuhari, N. A., & Ghazali, N. F. M.
(2019), “Medium Term Load Forecasting Using Statistical Feature Self Organizing Maps (SOM)”, Journal of Telecommunication, Electronic and Computer Engineering (JTEC), 11(2), pp. 25-29.
[13]. A. Şahiner, R. Akbay, N. Yilmaz (2019), “Fuzzy Logic Modeling and Optimization of Academic Achievement of Students”, Yildiz Journal of Educational Research, 4(1), pp. 85-100.
[14]. D. LeJeune, R. G. Baraniuk, R. Heckel (2019), “Adaptive Estimation for Approximate k-Nearest-Neighbor Computations”, Proceedings of the 22nd International Conference on Artificial Intelligence and Statistics (AISTATS) 2019, Naha, Okinawa, Japan, pp.1-11.
PHỤ LỤC
CÀI ĐẶT CÁC HÀM CHÍNH CỦA HỆ THỐNG 1. Hàm phân cụm K-Means
publicvoid KMeansClustering(int k, string fileData, string dirCluster) {
//Doc file de load tat ca du lieu
TextfileCluster tfc = newTextfileCluster(); string[] Lines = tfc.ReadAllLine(fileData); //Khoi tao k tam
string[] Centers = newstring[k]; for (int i = 0; i < k; i++)
Centers[i] = Lines[i];
//Tao cac cum HocsinhCluster tren bo nho chinh HocSinhCluster[] HSClusters = newHocSinhCluster[k]; for (int i = 0; i < k; i++)
{
HSClusters[i] = newHocSinhCluster();
HSClusters[i].CW.CENTER = Line2Vector(Centers[i]); }
bool Flag = true; while (Flag == true) {
//Phan phoi vao cac cum
foreach (string line in Lines) {
//Tim cum gan nhat
int indexMin = IndexMinCluster(HSClusters, line); //Phan bo vao cum
HocSinh HS = CreateHocSinh(line);
HSClusters[indexMin].DSHocSinh.Add(HS); }
//Tinh trung binh cac tam
for (int i = 0; i < k; i++)
AveCenter[i] = AveClusterCenter(HSClusters[i]); //So sanh cac tam
if (IsEqualArrCenter(AveCenter, HSClusters) == false) {
for (int i = 0; i < k; i++) { HSClusters[i] = null; HSClusters[i] = newHocSinhCluster(); HSClusters[i].CWp.CENTER = AveCenter[i]; } } else Flag = false; }
//Cap nhat trong so cho cac cum for (int i = 0; i < k; i++)
HSClusters[i].CWp.WEIGHT = GetWeight(HSClusters[i].CWp.CENTER); //Cap nhat RootCluster
RootCluster Root = newRootCluster(); for (int i = 0; i < k; i++)
{
Root.LISTCW.Add(HSClusters[i].CWp);
Root.LISTFILE.Add("Cluster" + (i + 1).ToString() + ".txt"); }
//Luu cac phan tu vao file cluster for (int i = 0; i < k; i++)
SaveCluster(HSClusters[i], dirCluster + "/" + Root.LISTFILE.ElementAt(i));
//Luu Root Cluster
SaveRootCluster(Root, dirCluster + "/" + "RootCluster.txt"); }
{
if (File.Exists(file)) File.Delete(file);
TextfileCluster tfc = newTextfileCluster(); ClusterMethod clm = newClusterMethod();
string Center = clm.Vector2String(HSc.CW.CENTER); string Weight = clm.Vector2String(HSc.CW.WEIGHT); tfc.WriteLineTextFile(Center,file); tfc.WriteLineTextFile(Weight, file); int num = HSc.DSHS.Count;
for (int i = 0; i < num; i++) {
string Diem = HSc.DSHS[i].MasoHocSinh + "@" + "Diem" +"@" + clm.Vector2String(HSc.DSHS[i].DIEM);
string Nangluc = "@" + "NangLuc" + "@" + HSc.DSHS[i].KHTN.ToString() + "@" +
HSc.DSHS[i].KHXH.ToString() + "@" + HSc.DSHS[i].HOCLUC + "@" + HSc.DSHS[i].DANHHIEU; tfc.WriteLineTextFile(Diem + Nangluc, file);
} }
void SaveRootCluster(RootCluster Root, string file) {
if (File.Exists(file)) File.Delete(file);
TextfileCluster tfc = newTextfileCluster(); ClusterMethod clm = newClusterMethod(); int num = Root.LISTCW.Count;
for(int i = 0; i < num; i++) {
string filename = Root.LISTFILE.ElementAt(i); string Center = filename + "@" + "Center" + "@" + clm.Vector2String(Root.LISTCW.ElementAt(i).CENTER); string Weight = "@" + "Weight" + "@" +
clm.Vector2String(Root.LISTCW.ElementAt(i).WEIGHT);
tfc.WriteLineTextFile(Center + Weight, file); }
2. Hàm chọn cụm chiến thắng void ShowSOMWinnerCluster() { //Load RootCluster TextfileCluster tfc = newTextfileCluster(); ClusterMethod clm = newClusterMethod(); string[] Lines = tfc.ReadAllLine(Root); int num = Lines.Length;
string[] FilenameClusters = newstring[num]; string[] Center = newstring[num];
string[] Weight = newstring[num]; for (int i = 0; i < num; i++) {
string[] words = Lines[i].Split('@');
words = clm.RemoveBlank(words); FilenameClusters[i] = words[0]; Center[i] = words[2];
Weight[i] = words[4]; }
//Chon cum chien thang
string filenameWinner = GetFileClusterWinner(HSPreditionWeight, Center, FilenameClusters);
fileWinner = dirCluster + "/" + filenameWinner; //Hien thi len textbox
string[] ClusterLines = tfc.ReadAllLine(fileWinner); int len = ClusterLines.Length;
for (int i = 0; i < len; i++)
textBox19.Text += ClusterLines[i] + "\r\n"; }
3. Hàm phân lớp và dự báo theo k-NN
void kNN() {
string hocluc = MaxHocluc(fileWinner); string danhhieu = MaxDanhhieu(fileWinner); double KHTN = AveKHTN(fileWinner);
double KHXH = AveKHXH(fileWinner);
string recomment = @"Nên chọn tổ hợp mơn: ";
if (KHTN >= KHXH) recomment += @"Khoa học tự nhiên"; else recomment += @"Khoa học xã hội";
}
string MaxHocluc(string filecluster) {
string[] HL = { "Giỏi", "Khá", "Trung bình", "Yếu", "Kém" }; string hocluc = HL[0];
int len = HL.Length;
for(int i = 0; i < len; i++) {
if (CountHocluc(hocluc, filecluster) < CountHocluc(HL[i], filecluster)) hocluc = HL[i];
} return hocluc; }
string MaxDanhhieu(string filecluster) {
string[] DH = { "Học sinh giỏi", "Học sinh tiên tiến", "Khơng cĩ danh hiệu" }; string danhhieu = DH[0];
int len = DH.Length;
for (int i = 0; i < len; i++) {
if (CountHocluc(danhhieu, filecluster) < CountHocluc(DH[i], filecluster)) danhhieu = DH[i];
} return danhhieu; }
double AveKHTN(string filecluster) { double res = 0.0; int count = 0; TextfileCluster tfc = newTextfileCluster(); ClusterMethod clm = newClusterMethod();
string[] Lines = tfc.ReadAllLine(filecluster); int len = Lines.Length;
for (int i = 2; i < len; i++) {
string[] words = Lines[i].Split('@');
words = clm.RemoveBlank(words); res += clm.ToDecimal(words[4]); count++;
} if (count != 0)
res = res / count; return res;
}
double AveKHXH(string filecluster) {
double res = 0.0; int count = 0;
TextfileCluster tfc = newTextfileCluster(); ClusterMethod clm = newClusterMethod();
string[] Lines = tfc.ReadAllLine(filecluster); int len = Lines.Length;
for (int i = 2; i < len; i++) {
string[] words = Lines[i].Split('@');
words = clm.RemoveBlank(words); res += clm.ToDecimal(words[5]); count++;
} if (count != 0)
res = res / count; return res;
4. Một số hàm xử lý trên cụm dữ liệu
publicint ToInt32(string myStr) {
bool res; int a;
res = int.TryParse(myStr, out a); return a;
}
//chuyển một chuỗi thành một số thực publicdouble ToDecimal(string myStr) {
bool res; double a;
res = double.TryParse(myStr, out a); return a;
}
//Chuyển một Vector (List) số thực (double) thành một chuỗi số, mỗi số cách nhau một khoảng trắng
publicstring Vector2String(List<double> Vector) {
string strFeature = string.Empty; if (Vector == null) return"#NONE#"; if (Vector.Count == 0) return"#NONE#"; foreach (double num in Vector)
strFeature += num.ToString() + " "; return strFeature.Trim();
}
//Chuyển một mảng các chuỗi số thành một Vector (List) chứa các số double publicList<double> String2Vector(string[] DigitString)
{
if (DigitString == null) returnnull; if (DigitString.Length == 0) returnnull;
DigitString = RemoveBlank(DigitString); int len = DigitString.Length;
List<double> Vector = newList<double>(); for (int i = 0; i < len; i++)
Vector.Add(ToDecimal(DigitString[i])); return Vector;
//Chuyển một chuỗi số thành một Vector (List) chứa các số double publicList<double> String2Vector(string DigitString)
{
if (DigitString.Trim() == string.Empty) returnnull; List<double> Vector = newList<double>();
if (DigitString == string.Empty) returnnull;
char[] delimiters = newchar[] { '\t', '\r', '\n', ';', '!', ':', ',', ' ' }; string[] wordsDigit = DigitString.Split(delimiters,
StringSplitOptions.RemoveEmptyEntries);
wordsDigit = RemoveBlank(wordsDigit); return String2Vector(wordsDigit);
}
//Tính khoảng cách Euclide trung bình của một vector đến gốc tọa độ publicdouble EuclideDistance(List<double> V) { if (V == null) return 0.0; if (V.Count == 0) return 0.0; double dis = 0.0; foreach (double a in V) { dis += a*a; }
dis = dis / (double)(V.Count); returnMath.Sqrt(dis);
}
//Tính khoảng cách Euclide của hai vector
publicdouble EuclideDistance(List<double> V1, List<double> V2) {
double dis = 0.0;
if (V1 == null) return EuclideDistance(V2); if (V2 == null) return EuclideDistance(V1); int m = V1.Count;
int n = V2.Count;
if (m == 0) return EuclideDistance(V2); if (n == 0) return EuclideDistance(V1);
for (int i = 0; i < n; i++) {
dis += (V1.ElementAt(i) - V2.ElementAt(i)) * (V1.ElementAt(i) - V2.ElementAt(i));
}
dis = dis / (double)n; returnMath.Sqrt(dis);
}
//Tính tích vơ hướng của hai vector
publicdouble productVector(List<double> V1, List<double> V2) { double prod = 0.0; if (V1 == null) return 0.0; if (V2 == null) return 0.0; int m = V1.Count; int n = V2.Count; if (m == 0) return 0.0; if (n == 0) return 0.0; if (m != n) return 0.0; for (int i = 0; i < n; i++) {
prod += (V1.ElementAt(i) *V2.ElementAt(i)); }
return prod; }
//Tính giá trị sigmoid của một giá trị publicdouble sigmoid(double a)
{
double ex = Math.Exp(a); double sig = ex / (ex + 1.0); return sig;