Bài 42: Tổng quan về tích hợp Mô hình Máy học vào hệ thống Kinh doanh – Quản lý

Trong chuỗi các bài học này Tui sẽ hướng dẫn các bạn cách thức lập trình các mô hình máy học và tích hợp mô hình máy học vào hệ thống quản lý, kinh doanh. Trước tiên là các bạn cần hiểu sơ qua về mô hình tổng quan của máy học, hiểu được các bước cần thiết khi xây dựng mô hình máy học, biết cách tích hợp nó vào các hệ thống đã có sẵn hoặc chưa có sẵn tùy thuộc vào nhu cầu sử dụng cũng như tùy thuộc vào cách thức thiết kế cấu trúc cơ sở dữ liệu và loại dữ liệu.

Máy học có rất nhiều ứng dụng cho từng trường hợp cụ thể, và nó lệ thuộc vào kinh nghiệm cũng như tư tưởng của kỹ sư thiết kế mô hình máy học, mỗi người có thể đưa ra các quy trình khác nhau, tuy nhiên nó cũng có các điểm chung cơ bản nhất khi xây dựng mô hình máy học.

Ta có thể ứng dụng máy học vào các bài toán như: Phân loại, Phân cụm, hồi quy. Chúng ta có thể áp dụng mô hình máy học vào các lĩnh vực như: Sản xuất, Chăm sóc sức khỏe và khoa học đời sống, Các dịch vụ tài chính, Các hệ thống bán lẻ, Truyền thông và giải trí, Cùng các lĩnh vực khác…

01. Đối với Lĩnh vực Sản xuất:

Máy học có thể hỗ trợ bảo trì dự đoán, kiểm soát chất lượng và nghiên cứu đổi mới trong lĩnh vực sản xuất. Công nghệ máy học cũng giúp các công ty cải thiện giải pháp hậu cần, bao gồm quản lý tài sản, chuỗi cung ứng và kho hàng.

(source : Internet)

02. Đối với lĩnh vực Chăm sóc sức khỏe và khoa học đời sống:

Sự phát triển như vũ bão của cảm biến và thiết bị có thể đeo được đã tạo ra một lượng lớn dữ liệu về sức khỏe. Các chương trình máy học có thể phân tích thông tin này và hỗ trợ bác sĩ chẩn đoán và điều trị trong thời gian thực.

(source : Internet)

03. Đối với lĩnh vực Dịch vụ tài chính:

Các dự án máy học về tài chính giúp cải thiện khả năng phân tích rủi ro và quy định. Công nghệ máy học có thể giúp các nhà đầu tư xác định cơ hội mới bằng cách phân tích hoạt động của thị trường chứng khoán, đánh giá các quỹ phòng hộ hoặc hiệu chỉnh danh mục tài chính

(source : Internet)

04. Đối với lĩnh vực Bán lẻ:

Nhà bán lẻ có thể sử dụng máy học để cải thiện dịch vụ khách hàng, quản lý hàng tồn kho, bán hàng gia tăng và tiếp thị đa kênh, dự báo doanh thu, dự báo nhu cầu tiêu dùng, dự báo xu hướng…

(source : Internet)

05. Đối với lĩnh vực Truyền thông và giải trí:

Các công ty giải trí tìm đến máy học để hiểu rõ hơn đối tượng mục tiêu của họ đồng thời cung cấp nội dung chân thực, được cá nhân hóa và theo nhu cầu của khách hàng. Thuật toán máy học được triển khai để giúp thiết kế trailer và các dạng quảng cáo khác, từ đó đề xuất nội dung được cá nhân hóa cho người tiêu dùng và thậm chí là hợp lý hóa quy trình sản xuất.

(source : Internet)

Ngoài ra đôi khi chúng ta cũng hay phân vân, bối rối giữa khái niệm về Trí tuệ nhân tạo và Máy học, thì dưới đây thì hãng AWS có bảng phân biệt 2 khái niệm này, Tui tổng hợp lại để các bạn hiểu thêm:

Trí tuệ nhân tạoMáy học
Khái niệmAI là thuật ngữ rộng cho các ứng dụng dựa trên máy móc bắt chước trí thông minh của con người. Không phải tất cả các giải pháp AI đều là ML.ML là một phương pháp trí tuệ nhân tạo. Tất cả các giải pháp ML đều là các giải pháp AI.
Trường hợp sử dụng phù hợp nhấtAI là lựa chọn tốt nhất để hoàn thành một tác vụ phức tạp của con người một cách hiệu quả.ML là lựa chọn tốt nhất để xác định các mẫu hình trong các tập dữ liệu lớn để giải quyết các vấn đề cụ thể.
MethodsAI có thể sử dụng các phương pháp khác nhau, như dựa trên quy tắc, mạng nơ-ron, thị giác máy tính, v.v. Đối với ML, người ta tự chọn và trích xuất các tính năng từ dữ liệu thô và gán trọng số để đào tạo mô hình.
ImplementsViệc triển khai AI phụ thuộc vào tác vụ. AI thường được xây dựng sẵn và truy cập thông qua các API.Bạn đào tạo các mô hình ML mới hoặc hiện có cho trường hợp sử dụng cụ thể của bạn. Cũng có sẵn các API ML được xây dựng sẵn.
(source : AWS)

Và dưới đây là quan điểm cá nhân của Tui liên quan tới máy học hay trí tuệ nhân tạo, và nó có thể làm không ưng cái bụng của một số người:

Đừng bao giờ thần thánh hóa Trí tuệ nhân tạo hay Máy học. Chúng chỉ đóng góp một vai trò nhất định trong hệ thống, giúp người quản trị đưa ra các quyết định nhanh chóng và phù hợp hơn.

Muốn ứng dụng máy học thì trước tiên chúng ta phải có hệ thống quản trị tốt trước đã, và các dữ liệu nên được cấu trúc phù hợp.

Nỗi sợ trí tuệ nhân tạo, máy học hay Robot thông minh sẽ thay thế con người? Cướp công việc của con người?

Không bao giờ có điều đó xảy ra, mỗi một công nghệ mới xuất hiện thì nó sẽ tạo ra rất nhiều nhóm các ngành nghề mới, công việc mới cho Con người làm việc. Nó chỉ thay thế những STUPID JOB

“Lùa Gà” là một từ lóng mà chúng ta thường nghe, một số trung tâm, chuyên gia đào tạo… cố tình tạo nên nỗi sợ hoang đường để học viên đăng ký học, hay đăng ký mua sản phẩm liên quan.

Chúng ta học để hiểu biết, để ứng dụng trong thực tiễn vì kiến thức là vô cùng vô tận. Học để thích ứng với sự phát triển như vũ bão của công nghệ mới chứ không phải vì lo sợ nó CƯỚP công việc của mình.

Vì mỗi người mỗi quan điểm khác nhau, nhìn bài toán khách hàng gặp phải dưới các lăng kính khác nhau nên mỗi người sẽ có những quy trình xử lý khác nhau, nhưng suy cho cùng thì cũng cùng một mục đích là đem lại dịch vụ tốt nhất cho khách hàng. Dưới đây Tui đưa ra một quy trình chung cơ bản về thiết kế mô hình máy học và tích hợp vào hệ thống nói chung, các bạn có thể tham khảo (có thể hoàn toàn KHÔNG ĐỒNG Ý hoặc ĐỒNG Ý một PHẦN). Dĩ nhiên các chuỗi bài hướng dẫn xây dựng mô hình máy học và tích hợp vào hệ thống mà Tui hướng dẫn trên Blog này sẽ nhìn chung thực hiện theo các quy trình này. Tùy thuộc vào tình hình thực tế của bài toán mà các bạn đang giải quyết để có thể cải biên nó phù hợp hơn.

Và cũng cần lưu ý: Không có mô hình máy học nào sai, chỉ có mô hình máy học phù hợp hay chưa phù hợp. Mô hình máy học có thể chạy tốt với tập dữ liệu X nhưng chưa chắc chạy tốt với tập dữ liệu Y. Đó là lý do vì sao chúng ta cần cải tiến mô hình máy học thường xuyên khi nhu cầu hay dữ liệu bị thay đổi đáng kể.

Ta xem lại mô hình tổng quan:

Lưu đồ trên là việc tích hợp mô hình máy học vào một hệ thống đang vận hành. Dĩ nhiên có những trường hợp ta chưa có hệ thống (dữ liệu) nhưng ta có ý tưởng về mô hình máy học từ đó ta thiết kế hệ thống đáp ứng ý tưởng mô hình máy học . Và cũng có những trường hợp hệ thống có sẵn rồi, dữ liệu có sẵn rồi, bây giờ ta cần tích hợp mô hình máy học vào, hầu hết bài học Tui sẽ hướng dẫn trường hợp số 2 là hệ thống có sẵn.

  • Ở lưu đồ trên ta thấy, đa phần nó có khoảng 3 phiên chính trong xây dựng và tích hợp mô hình máy học: Phiên PREPARING DATA, Phiên BUILD MODEL và phiên USE MODEL.
  • PREPARING DATA: Là Bước chuẩn bị dữ liệu, tùy thuộc vào các bài toán khác nhau, hay dữ liệu khác nhau mà ta có các bước chuẩn bị dữ liệu chi tiết khác nhau, nhìn chung thì ta cần có các thao tác như “làm sạch và chuẩn hóa dữ liệu”, “Mô hình hóa hướng đối tượng cho dữ liệu” để phục vụ cho việc lập trình được dễ dàng hơn. Ta cần phải chuẩn bị dữ liệu thật tốt để Build Mô hình, vì Cơ sở dữ liệu lưu trữ không phải lúc nào cũng lưu trữ các dữ liệu tốt, tối ưu mà nó có thể lưu những dữ liệu không tốt, các dữ liệu không có ích trong quá trình Build mô hình. Mà chúng ta cần biết nguyên tắc “Garbage In – Garbage Out” nghĩ là dữ liệu không tốt thì cho mô hình không tốt.
    1. Khi khách hàng ở bước (0) có các hoạt động trên hệ thống (1), chẳng hạn như tương tác sản phẩm, commments, review, đặt đơn hàng… thì các dữ liệu này sẽ được lưu vào Database (2). Database này chúng ta cần tiền xử lý cho tốt, nó sẽ nằm trong phiên PREPARING DATA.
    2. Mỗi dữ liệu khác nhau, mỗi bài toán khác nhau mà bước (3) làm sạch và chuẩn hóa dữ liệu sẽ khác nhau, có thể thêm nhiều các bước con khác nhau, sử dụng các kỹ thuật khác nhau.
    3. Mô hình hóa hướng đối tượng (4) có thể được áp dụng để giúp cho việc xử lý dữ liệu, mô hình được tốt hơn.
  • BUILD MODEL: Là các bước từ số (5) tới số (9). Phiên này sẽ build mô hình máy học, các bước bao gồm lọc và tải dữ liệu, lựa chọn giải thuật và các tham số cho mô hình, train mô hình, đánh giá và cải thiện mô hình, cuối cùng là xuất mô hình ra ổ cứng để tái sử dụng, tích hợp vào hệ thống.
    1. Bước (5) “Filter and load data” có thể được xem là bước lọc và nạp dữ liệu để phục vụ cho train mô hình, ta cần chọn các thuộc tính/biến phù hợp cũng như tỉ lệ train/test khác nhau, nó ảnh hưởng tới chất lượng mô hình
    2. Bước (6) “Select Algorithms” Bước này ta lựa chọn các giải thuật máy học phù hợp với bài toán, cũng với việc lựa chọn các tham số đầu vào để train mô hình. Ví dụ như bài toán Classfification thì nên dùng giải thuật nào, bài toán Clustering thì nên dùng giải thuật nào, các bài toán liên quan Time Series Data thì nên dùng giải thuật nào….. Cái này ứng với bài toán cụ thể ta sẽ dùng.
    3. Bước (7) là bắt đầu train mô hình máy học, từ tập dữ liệu, giải thuật máy học, các tham số được lựa chọn phù hợp thì chương trình bày đầu train.
    4. Bước (8) sau khi train mô hình xong thì chúng ta cần đánh giá mô hình có chất lượng hay không, nếu mô hình chất lượng (ta cho rằng) thì qua Bước (9) để xuất mô hình xuống ổ cứng để tái sử dụng, để tích hợp vào hệ thống mà khách hàng yêu cầu. Nếu mô hình không chất lượng thì ta có nhiều giải pháp, ở trên thì Tui đưa ra 2 giải pháp: Hoặc là chúng ta quay lại bước (5) hoặc là chúng ta quay lại phiên PREPARING DATA. Vì cả 2 nơi này đều là nguyên dẫn có thể dẫn tới mô hình không đạt chất lượng mong muốn.
    5. Bước (9) là bước xuất mô hình ra ổ cứng (lưu), vì ta không thể khi chạy dịch vụ ví dụ như Khách hàng đang sử dụng hệ thống sàn thương mại điện tử, ta muốn gợi ý các sản phẩm mà khách hàng có khả năng mua cao thì ta lại chạy lại mô hình được (vì nó rất tốn thời gian, training mô hình rất lâu, khách hàng không thể ngồi chờ). do đó Bước (9) là lưu mô hình rồi thì các lần sau sử dụng ta chỉ cần tải lại mô hình này rồi tích hợp vào hệ thống thôi.
  • USE MODEL: Là các bước (10), (11). Các bước này nạp và tích hợp mô hình máy học vào hệ thống và sử dụng mô hình máy học.
    1. Bước (10) là nạp mô hình đã lưu từ bước (9), ví dụ khách hàng đăng nhập vào hệ thống sàn thương mại điện tử, ta muốn gợi ý các sản phẩm mà khách hàng có khả năng mua cao nhất thì ta sẽ đọc mô hình máy học ở Bước (9) để sử dụng, tích hợp nó vào hệ thống ở bước (11)
    2. Bước (11) Sau khi mô hình máy học được tích hợp vào hệ thống, chương trình sẽ triệu gọi mô hình máy học, gọi các hàm predict để đưa ra các kết quả phù hợp cho khách hàng. Và hiển nhiên Khách hàng có thể tiếp tục tương tác trên hệ thống ở bước (0) như vậy chúng ta có một vòng tròn khép kín, mỗi lần khách hàng tương tác thì hệ thống lại lưu lại cơ sở dữ liệu, và theo thời gian thì chúng ta biết rằng có thể sở thích khách hàng sẽ thay đổi theo thời gian (khả năng cao, ví dụ tháng 01 bạn thích ăn Dưa leo, nhưng qua tháng 02 bạn lại thích Dưa chuột) như vậy có thể dẫn tới mô hình máy học không còn chất lượng nữa, ta cần có cách đánh giá lại mô hình, có thể build lại. Cứ thế tiếp tục cải tiến mô hình để có được một dịch vụ tốt nhất cho khách hàng.

Trên đây là tổng quan về máy học, trí tuệ nhân tạo, cách áp dụng mô hình máy học vào các lĩnh vực khác nhau như: Sản xuất, Chăm sóc sức khỏe và khoa học đời sống, Các dịch vụ tài chính, Các hệ thống bán lẻ, Truyền thông và giải trí, Cùng các lĩnh vực khác…

Đặc biệt Tui đưa ra mô hình tổng quan chung cơ bản về xây dựng và tích hợp mô hình máy học vào hệ thống quản lý, giải thích ý nghĩa của từng bước. Và nó phụ thuộc vào bài toán của khách hàng, phụ thuộc vào dữ liệu, phụ thuộc vào lăng kính của kỹ sư máy học mà mỗi người có thể cải biên flow chart khác nhau, tuy nhiên về cơ bản thì các chức năng, các bước cốt lõi là như nhau.

Bài học sau Tui sẽ hướng dẫn cụ thể bài Dự báo giá nhà dùng hồi quy tuyến tính. Xây dựng mô hình máy học và chạy thử nghiệm trên giao diện Python PyQt6. Các bạn chú ý theo dõi

Chúc các bạn thành công

ML.Emotion

This framework is a Machine Learning framework. It is used to predict the Customer emotion from their feedbacks.

This framework is extended from the Microsoft Machine Learning ML.NET Model.

Datasets and instructions: https://github.com/thanhtd32/ML.Emotion#readme, Coding demo is “ML.EmotionDemo”

This Research from KMOU (Korea Maritime & Ocean University) – Data Science Lab – Room 407.

Authors: Duy Thanh Tran, Prof. Jun-Ho Huh

Any question, please free to contact me: thanhtd@uel.edu.vn

My full name: TRAN DUY THANH

Blog study coding: https://duythanhcse.wordpress.com/

Group support: https://www.facebook.com/groups/communityuni/

alt text

ML.Emotion – How to use?

Install nuget package

Install-Package ML.Emotion -ProjectName YourProject

Train-Test Set sample

Download The UCI Sentiment Labeled Sentences dataset zip file: http://archive.ics.uci.edu/ml/machine-learning-databases/00331/sentiment%20labelled%20sentences.zip You use the file “yelp_labelled.txt” or you can download the file at https://github.com/thanhtd32/ML.Emotion/tree/main/TrainTestSet

Full code:

using ML.Emotion.Data;
using ML.Emotion.Predict;

namespace ML.EmotionDemo
{
    public partial class frmMain : Form
    {
        //Declare EmotionEngine object
        EmotionEngine emotionEngine =new EmotionEngine();
        string folder = "Models";
        public frmMain()
        {
            InitializeComponent();
        }
    
        private void frmMain_Load(object sender, EventArgs e)
        {
            LoadModelIntoCombo();
        }
        //1. Import dataset and split traint- test set
        private void btnLoadData_Click(object sender, EventArgs e)
        {
           if(openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string path=openFileDialog1.FileName;
                double ratio=double.Parse(txtTestRatio.Text);
                emotionEngine.ImportDataset(path, false, ratio);
            }
        }
        //2. Build model
        private void btnBuildModel_Click(object sender, EventArgs e)
        {
            bool ret=emotionEngine.BuildAndTrainModel();
            if (ret)
                lblBuildModelStatus.Text = "Build Model successfully";
            else
                lblBuildModelStatus.Text = "Build Model failed";
        }
        //3. Evaluate model
        private void btnEvaluateModel_Click(object sender, EventArgs e)
        {
            Metric metric= emotionEngine.Evaluate();
            txtAccuracy.Text=metric.Accuracy.ToString();
            txtAUC_PR.Text=metric.AUC_PR.ToString();
            txtAUC_ROC.Text=metric.AUC_ROC.ToString();
            txtF1Score.Text=metric.F1Score.ToString();  
            txtLogLoss.Text=metric.LogLoss.ToString();
            txtLogLossReduction.Text=metric.LogLossReduction.ToString();
            txtNegativePrecision.Text=metric.NegativePrecision.ToString();
            txtNegativeRecall.Text=metric.NegativeRecall.ToString();    
            txtPositivePrecision.Text=metric.PositivePrecision.ToString();
            txtPositiveRecall.Text = metric.PositiveRecall.ToString();
        }
        //4. Save model
        private void btnSaveModel_Click(object sender, EventArgs e)
        {
            if (Directory.Exists(folder) == false)
            {
                Directory.CreateDirectory(folder);
            }
            string path = folder + "\\ML.Emotion-" + DateTime.Now.ToString("ddMMyyyy-hhmmss") + ".zip";
            bool ret = emotionEngine.SaveModel(path);
            if (ret)
                lblSaveModelStatus.Text = "Save Model successfully";
            else
                lblSaveModelStatus.Text = "Save Model failed";
            LoadModelIntoCombo();
        }
        //5. Load model
        private void LoadModelIntoCombo()
        {
            cboModel.Items.Clear();

            if (Directory.Exists(folder) == false)
            {
                return;
            }
            string[] files = Directory.GetFiles(folder);
            foreach (string file in files)
            {
                FileInfo fi = new FileInfo(file);
                cboModel.Items.Add(fi.Name);
            }
        }
        //5. Load model and pick model
        private void btnLoadModel_Click(object sender, EventArgs e)
        {
            if (cboModel.SelectedIndex == -1)
                return;
            string modelName = folder + "\\" + cboModel.Text;
            bool ret = emotionEngine.LoadModel(modelName);
            if (ret)
                lblLoadModelStatus.Text = "Load Model successfully";
            else
                lblLoadModelStatus.Text = "Load Model failed";
        }
        //6. Predict
        private void btnPredict_Click(object sender, EventArgs e)
        {
            FeedbackData feedback=new FeedbackData();
            feedback.Data=txtInputData.Text;
            EmotionDataPrediction result = emotionEngine.Predict(feedback);
            
            picBlameArrow.Visible = false;
            lblBlameProbability.Visible = false;

            picComplimentArrow.Visible = false;
            lblComplimentProbability.Visible = false;

            picNeutralArrow.Visible = false;
            lblNeutralProbability.Visible = false;
            if(result.EmotionType==EmotionType.Blame)
            {
                picBlameArrow.Visible = true;
                lblBlameProbability.Visible = true;
                lblBlameProbability.Text = "Probability:" + result.ProbabilityFormat;
            }
            else if(result.EmotionType==EmotionType.Neutral)
            {
                picNeutralArrow.Visible = true;
                lblNeutralProbability.Visible = true;
                lblNeutralProbability.Text = "Probability:" + result.ProbabilityFormat;
            }
            else if(result.EmotionType== EmotionType.Compliment)
            {
                picComplimentArrow.Visible = true;
                lblComplimentProbability.Visible = true;
                lblComplimentProbability.Text = "Probability:" + result.ProbabilityFormat;
            }
        }
    }
}

ML.RealEstate

Most recently, Microsoft has introduced the ML.NET Model Builder tool to support machine learning predictive system processing, but it has only been introduced in the general model, so it is still difficult to apply into actual house price predictions. Therefore, we applied and improved this model to develop a new model ML.RealEstate that focuses on the private housing price prediction segment. The model will show the most common characteristics for private houses, the model will help people estimate the actual price of the house to avoid financial loss when inflated.

This Research from KMOU (Korea Maritime & Ocean University) – Data Science Lab – Room 407.

Authors: Duy Thanh Tran, Prof. Jun-Ho Huh

Any question, please free to contact me: thanhtd@uel.edu.vn

My full name: TRAN DUY THANH

Blog study coding: https://duythanhcse.wordpress.com/

Group support: https://www.facebook.com/groups/communityuni/

alt text

ML.RealEstate – How to use?

Install nuget package

Install-Package ML.RealEstate -ProjectName YourProject

The classes of the ML.RealEstate:

alt text

Download and Copy Dataset folder “RealEstateDataset”(https://github.com/thanhtd32/ML.RealEstate/tree/main/RealEstateDataset) into your execution directory. We will continue update the dataset day by day, now there are about 2.353 private house transactions, in the future the transactions have more than 10.000 transactions , just like this figure as below:

alt text

All Soure code how to use ML.RealEstate is stored https://github.com/thanhtd32/ML.RealEstate/tree/main/ML.RealEstateDemo, you can download all from https://github.com/thanhtd32/ML.RealEstate

using ML.RealEstate.Data;
using ML.RealEstate.Predict;
using System.IO;
namespace ML.RealEstateDemo
{
    public partial class frmMain : Form
    {
        BrokerRealEstate broker = new BrokerRealEstate();
        string folder = "Models";
        public frmMain()
        {
            InitializeComponent();
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            RealEstateDatabase.LoadAllDataset();
            ShowDataInUI();
            LoadModelIntoCombo();
        }
        private void LoadModelIntoCombo()
        {
            cboModel.Items.Clear();
            
            if(Directory.Exists(folder)==false)
            {
                return;
            }
            string []files=Directory.GetFiles(folder);
            foreach (string file in files)
            {
                FileInfo fi=new FileInfo(file);
                cboModel.Items.Add(fi.Name);
            }
        }

        private void ShowDataInUI()
        {
            cboHouseType.DataSource = RealEstateDatabase.GetHouseTypes();
            cboHouseType.ValueMember = "Id";
            cboHouseType.DisplayMember = "TypeOfHouse";

            cboCity.DataSource = RealEstateDatabase.GetCities();
            cboCity.ValueMember = "Id";
            cboCity.DisplayMember = "CityName";
        }
        //Step 1. Import Data and create Train - Test Set
        private void btnImportData_Click(object sender, EventArgs e)
        {
            double ratio = double.Parse(txtRatio.Text);
            int seed = int.Parse(txtSeed.Text);
            bool ret = broker.ImportDataset(RealEstateDatabase.HouseDataList!, ratio, seed);
            if (ret)
                lblStatusImportData.Text = "Import and make train - test dataset successfully";
            else
                lblStatusImportData.Text = "Import and make train - test dataset failed";
            lblStatusBuildModel.Text = "";
            lblStatusEvaluate.Text = "";
            lblStatusSaveModel.Text = "";
            lblStatusLoadModel.Text = "";
        }
        //Step 2. Build Model
        private void btnBuildModel_Click(object sender, EventArgs e)
        {
            string[] features ={ "HouseTypeId", "WardId", "DistrictId", "CityId",
                    "Area", "FrontiSpiece","Entrance","Floor","BedRoom","ToiletRoom" };
            int iterator = 100;
            bool ret = broker.BuildModel(features, iterator);
            if (ret)
                lblStatusBuildModel.Text = "Build Model successfully";
            else
                lblStatusBuildModel.Text = "Build Model failed";
        }
        //Step 3. Evaluate
        private void btnEvaluate_Click(object sender, EventArgs e)
        {
            Metric metric = broker.Evaluate();
            txtRSquared.Text = metric.RSquared.ToString();
            txtMSE.Text = metric.MSE.ToString();
            txtRMSE.Text = metric.RMSE.ToString();
            txtMAE.Text = metric.MAE.ToString();
            txtLossFunction.Text = metric.LossFunction.ToString();
        }
        //Step 4. Save Model
        private void btnSaveModel_Click(object sender, EventArgs e)
        {
            if(Directory.Exists(folder)==false)
            {
                Directory.CreateDirectory(folder);  
            }
            string path = folder + "\\ML.RealEstateModel-"+DateTime.Now.ToString("ddMMyyyy-hhmmss")+".zip";
            bool ret = broker.SaveModel(path);
            if (ret)
                lblStatusSaveModel.Text = "Save Model successfully";
            else
                lblStatusSaveModel.Text = "Save Model failed";
            LoadModelIntoCombo();
        }
        //Step 5. Load Model
        private void btnLoadModel_Click(object sender, EventArgs e)
        {
            if (cboModel.SelectedIndex == -1)
                return;
            string modelName = folder + "\\" + cboModel.Text;
            bool ret = broker.LoadModel(modelName);
            if (ret)
                lblStatusLoadModel.Text = "Load Model successfully";
            else
                lblStatusLoadModel.Text = "Load Model failed";
        }
        //6.Predict
        private void btnPredict_Click(object sender, EventArgs e)
        {
            if (cboDistrict.SelectedItem == null ||
                cboCity.SelectedItem == null)
                return;
            House inputData = new House();
            inputData.HouseTypeId = (cboHouseType.SelectedItem as HouseType)!.Id;
            inputData.WardId = (cboWard.SelectedItem as Ward)!.Id;
            inputData.DistrictId = (cboDistrict.SelectedItem as District)!.Id;
            inputData.CityId = (cboCity.SelectedItem as City)!.Id;
            inputData.Area = float.Parse(txtArea.Text);
            inputData.FrontiSpiece = float.Parse(txtFrontiSpiece.Text);
            inputData.Entrance = float.Parse(txtEntrance.Text);
            inputData.Floor = float.Parse(txtFloor.Text);
            inputData.BedRoom = float.Parse(txtBedRoom.Text);
            inputData.ToiletRoom = float.Parse(txtToiletRoom.Text);
            Prediction result = broker.Predict(inputData);
            txtPrice.Text = result.Price.ToString();

           /* lblStatusBuildModel.Text = "";
            lblStatusEvaluate.Text = "";
            lblStatusSaveModel.Text = "";
            lblStatusLoadModel.Text = "";
            lblStatusImportData.Text = ""; */
        }

        private void cboCity_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboCity.SelectedIndex == -1)
                return;
            City? city = cboCity.SelectedItem as City;
            cboDistrict.DataSource = RealEstateDatabase.GetDistricts(city!.Id);
            cboDistrict.DisplayMember = "DistrictName";
            cboDistrict.ValueMember = "Id";
        }

        private void cboDistrict_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboDistrict.SelectedIndex == -1)
                return;
            District? district = cboDistrict.SelectedItem as District;
            cboWard.DataSource = RealEstateDatabase.GetWards(district!.Id);
            cboWard.DisplayMember = "WardName";
            cboWard.ValueMember = "Id";
        }
    }
}