public JiaMiTu InitialJiaMiTuPoint(JiaMiTu curMiTu, JiaMiTu father, JiaMiTu mother) { float totalPoint = 0; var curMiTuType = curMiTu.GetType(); var fatherMiTuType = curMiTu.GetType(); var motherMiTuType = curMiTu.GetType(); foreach (var field in specialFields) { var fatherValue = (float)fatherMiTuType.GetField(field).GetValue(father); var motherValue = (float)motherMiTuType.GetField(field).GetValue(mother); var summary = fatherValue + motherValue; curMiTuType.GetField(field).SetValue(curMiTu, summary); totalPoint += summary; } //curMiTu.BODY_COLOR = father.BODY_COLOR + mother.BODY_COLOR; //curMiTu.EYE = father.EYE + mother.EYE; //curMiTu.EYE_COLOR = father.EYE_COLOR + mother.EYE_COLOR; //curMiTu.FIGURE = father.FIGURE + mother.FIGURE; //curMiTu.MOUTH = father.MOUTH + mother.MOUTH; //curMiTu.PATTERN = father.PATTERN + mother.PATTERN; //curMiTu.PATTERN_COLOR = father.PATTERN_COLOR + mother.PATTERN_COLOR; ////汇总得分 //totalPoint = curMiTu.BODY_COLOR + curMiTu.EYE + curMiTu.EYE_COLOR + curMiTu.FIGURE + curMiTu.MOUTH + curMiTu.PATTERN + curMiTu.PATTERN_COLOR; curMiTu.TotalPoint = totalPoint; curMiTu.FatherRareDegree = father.RareDegree; curMiTu.MotherRareDegree = mother.RareDegree; return(curMiTu); }
public JiaMiTu InitialJiaMiTu(BsonDocument doc) { var miTuObj = new JiaMiTu() { //BODY_COLOR = doc["BODY_COLOR.rare"].ToString()=="true"?1:0, //EYE = doc["EYE.rare"].ToString() == "true" ? 1 : 0, //EYE_COLOR = doc["EYE_COLOR.rare"].ToString() == "true" ? 1 : 0, //FIGURE = doc["FIGURE.rare"].ToString() == "true" ? 1 : 0, //MOUTH = doc["MOUTH.rare"].ToString() == "true" ? 1 : 0, //PATTERN = doc["PATTERN.rare"].ToString() == "true" ? 1 : 0, //PATTERN_COLOR = doc["PATTERN_COLOR.rare"].ToString() == "true" ? 1 : 0, }; var type = miTuObj.GetType(); try { //赋值遍历 foreach (var elem in doc.Elements) { if (specialFields.Contains(elem.Name)) { var curValue = doc[elem.Name] as BsonDocument; if (curValue.Text("rare") == "true") { var getProperty = type.GetField(elem.Name); if (getProperty != null) { getProperty.SetValue(miTuObj, 1); } } } } miTuObj.RareDegree = (int)Enum.Parse(typeof(RareDegree), doc.Text("rareDegreeKey")); } catch (Exception ex) { } return(miTuObj); }
public async Task start() { bool alwayCreateModel = true; //是否建立模型文档 string labelColumn = "RareDegree"; //需要计算的字段 student string[] oneHotColumns = new string[] { }; //oneHot编码字段 string[] features = new string[] { "FatherRareDegree", "MotherRareDegree", "TotalPoint" }; //特征列, "classCount" "student" var curTypeNameIndex = 4; //幼儿园 1小学 4中学 5大学 6驾校 7教育其他 var tableName = "MiTuProfile"; var tableNameEgg = "MiTu"; //条件筛选项 var conStr = GetConnectionStr("192.168.1.124", "CrawlerDataBase"); var dataop = new MongoRepositoryHelperA3(conStr); //训练评估查询语句 var query = Query.And(Query.EQ("isUpdate", 1)); //预测语句 var fields = new string[] { "id", "BODY_COLOR", "EYE", "EYE_COLOR", "FIGURE", "MOUTH", "PATTERN", "PATTERN_COLOR", "rareDegreeKey", "parents" }; var traningJiaMiTuList = new List <JiaMiTu>(); //训练数据 var evaluateJiaMiTuList = new List <JiaMiTu>(); //评估数据 PredictionModel <JiaMiTu, JiaMiTuPrediction> model = null; ///模型地址 var modelFileName = $"{ModelDirectory}/{string.Join("_", features)}-{labelColumn}.zip"; if (File.Exists(modelFileName)) { model = await PredictionModel.ReadAsync <JiaMiTu, JiaMiTuPrediction>(modelFileName); // await在你的Main方法中添加一个方法意味着该Main方法必须具有async修饰符并返回a Task: // using System.Threading.Tasks; // 评估模型 } else { if (model == null) { var allExistJiaMiTuDocList = dataop.FindByQuery(tableName, query).SetFields(fields).ToList(); var allCount = allExistJiaMiTuDocList.Count(); int traningCount = (int)(allCount * 0.7);//评估的数据源个数 ///加载模型需要数据 foreach (var traningJiaMiTu in allExistJiaMiTuDocList) { if (!traningJiaMiTu.Contains("parents")) { continue; } var parents = traningJiaMiTu["parents"] as BsonArray; if (parents.Count <= 1) { continue; } var father = parents[0] as BsonDocument; var mother = parents[1] as BsonDocument; var curJiaMiTu = InitialJiaMiTu(traningJiaMiTu); //赋值字段 //var fatherDoc = allExistJiaMiTuDocList.Where(c => c.Text("id") == father.Text("petId")).FirstOrDefault(); //var motherDoc = allExistJiaMiTuDocList.Where(c => c.Text("id") == mother.Text("petId")).FirstOrDefault(); var fatherDoc = dataop.FindOne(tableName, Query.EQ("id", father.Text("petId"))); var motherDoc = dataop.FindOne(tableName, Query.EQ("id", mother.Text("petId"))); if (fatherDoc == null || motherDoc == null) { continue; } //父亲 var fatherMiTu = InitialJiaMiTu(fatherDoc); //母亲 var motherMiTu = InitialJiaMiTu(motherDoc); //当前加密兔 curJiaMiTu = InitialJiaMiTuPoint(curJiaMiTu, fatherMiTu, motherMiTu);//计算得分 if (curJiaMiTu.TotalPoint <= 0) { continue; } if (traningJiaMiTuList.Count <= traningCount) { traningJiaMiTuList.Add(curJiaMiTu); } else { evaluateJiaMiTuList.Add(curJiaMiTu); } } //PredictionModel<JiaMiTu, JiaMiTuPrediction> model = TrainAsync(); //改变的返回类型Train方法意味着你必须一个补充await,以调用codde Train在Method下面的代码如下所示: model = await Train(traningJiaMiTuList, modelFileName, labelColumn, oneHotColumns, features, specialFields); } Evaluate(evaluateJiaMiTuList, model); } var prediction1 = model.Predict(TestTrips.Trip1); Console.WriteLine("确认模型后按回车开始"); // var query = Query.And(Query.Exists("student", true), Query.Exists("teacher", true), Query.Exists("classCount", false)); var allJiaMiTuList = dataop.FindByQuery(tableNameEgg, Query.And(Query.Exists("pIds", true), Query.NE("isPredic", 1), Query.NE("isPass", 1))).ToList(); var ExecNum = Guid.NewGuid().ToString(); var index = 1; foreach (var JiaMiTu in allJiaMiTuList) { /// 比如没有班级字段通过模型的学生和老师个数来预测班级数 var id = JiaMiTu.Text("id"); var pIds = JiaMiTu["pIds"] as BsonArray; var fatherDoc = dataop.FindOne(tableName, Query.EQ("id", pIds[0].ToString())); var motherDoc = dataop.FindOne(tableName, Query.EQ("id", pIds[1].ToString())); if (fatherDoc == null || motherDoc == null) { continue; } var doc = new BsonDocument(); doc.Set("ExecNum", ExecNum); //父亲 var fatherMiTu = InitialJiaMiTu(fatherDoc); //母亲 var motherMiTu = InitialJiaMiTu(motherDoc); //当前加密兔 var Trip1 = InitialJiaMiTu(JiaMiTu); //赋值字段 Trip1 = InitialJiaMiTuPoint(Trip1, fatherMiTu, motherMiTu); //计算得分 if (motherMiTu.RareDegree >= (int)RareDegree.rare && fatherMiTu.RareDegree <= (int)RareDegree.rare || fatherMiTu.RareDegree >= (int)RareDegree.rare && motherMiTu.RareDegree <= (int)RareDegree.rare) { var prediction = model.Predict(Trip1); if (prediction.RareDegree != 0) { string txt = EnumDescription.GetFieldText((RareDegree)prediction.RareDegree); doc.Add($"{labelColumn}Predic", prediction.RareDegree); doc.Add($"{labelColumn}PredicTxt", txt);//总得分 if (txt != doc.Text("rareDegree")) { } #region 操作日志字段 doc.Add("isPredic", 1); //是否预测字段 doc.Add("point", Trip1.TotalPoint); //总得分 DBChangeQueue.Instance.EnQueue(new StorageData() { Name = tableNameEgg, Document = doc, Query = Query.EQ("_id", ObjectId.Parse(JiaMiTu.Text("_id"))), Type = StorageType.Update }); #endregion } Console.WriteLine($"fatherRareDegree:{fatherMiTu.RareDegree}motherRareDegree{motherMiTu.RareDegree} predic:{prediction.RareDegree} id:{id}"); } else { doc.Add("isPass", 1);//是否预测字段 DBChangeQueue.Instance.EnQueue(new StorageData() { Name = tableNameEgg, Document = doc, Query = Query.EQ("_id", ObjectId.Parse(JiaMiTu.Text("_id"))), Type = StorageType.Update }); } index++; if (index % 100 == 0) { Console.WriteLine("剩余处理{0}{1}", allJiaMiTuList.Count - index, ExecNum); } } StartDBChangeProcessQuick(dataop); Console.WriteLine("操作结束" + ExecNum); }