-
Notifications
You must be signed in to change notification settings - Fork 2
/
BumbleFormulaBot.cs
132 lines (115 loc) · 4.8 KB
/
BumbleFormulaBot.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using Microsoft.ML;
using Microsoft.ML.Data;
using System.Diagnostics;
namespace BumbleFormula
{
public static class BumbleFormulaBot
{
private static readonly string modelPath = Path.Combine(AppContext.BaseDirectory, "model2.zip");
private static readonly MLContext mlContext = new MLContext();
public static string Predict(Dictionary<string, double> features)
{
Debug.WriteLine($"Starting prediction. Model path: {modelPath}");
if (!File.Exists(modelPath))
{
Debug.WriteLine("Model file not found. Starting model training...");
TrainingModel.TrainModel();
Debug.WriteLine("Model training completed. Loading the trained model...");
}
else
{
Debug.WriteLine("Model file found. Proceeding to load the model...");
}
// Load trained model
ITransformer trainedModel = mlContext.Model.Load(modelPath, out _);
Debug.WriteLine("Model loaded successfully.");
// Create PredictionEngine
Debug.WriteLine("Creating prediction engine...");
var predEngine = mlContext.Model.CreatePredictionEngine<BumbleData, BumblePrediction>(trainedModel);
Debug.WriteLine("Prediction engine created.");
// Create input data object
BumbleData inputData = new BumbleData
{
age = (float)features["age"],
numberofherpictures = (float)features["numberofherpictures"],
numberoflinesinbio = (float)features["numberoflinesinbio"],
height = (float)features["height"],
physicalactivity = (float)features["physicalactivity"],
education = (float)features["education"],
drinking = (float)features["drinking"],
smoking = (float)features["smoking"],
wantchildren = (float)features["wantchildren"],
havekids = (float)features["havekids"],
politics = (float)features["politics"],
nils = (float)features["nils"],
profilenils = (float)features["profilenils"],
bionils = (float)features["bionils"],
lookingnils = (float)features["lookingnils"],
causenils = (float)features["causenils"],
interestnils = (float)features["interestnils"]
};
Debug.WriteLine($"Input Data: Age={inputData.age}, NumberofHerPictures={inputData.numberofherpictures}, NumberofLinesInBio={inputData.numberoflinesinbio}, Height={inputData.height}");
// Make predictions
var prediction = predEngine.Predict(inputData);
Debug.WriteLine("Prediction made.");
// Class labels
string[] classLabels = new[] { "gamer",
"ghoster",
"handsitter",
"seemserious",
"boldgold",
"unfriendly",
"fwb",
"friendzoner",
"nonegiver",
"serious",
"paranoid",
"claimserious",
"shygold",
"business",
"hk", };
// Get predictions with scores over 10%
var predictionsAbove60 = prediction.Scores
.Select((score, index) => new { Label = classLabels[index], Score = score })
.Where(x => x.Score >= 0.1)
.OrderByDescending(x => x.Score)
.Select(x => $"{x.Label}: {x.Score * 100}%")
.ToArray();
Debug.WriteLine("Predictions filtered. Scores over 10");
foreach (var pred in predictionsAbove60)
{
Debug.WriteLine(pred);
}
return string.Join("\n", predictionsAbove60);
}
}
public class BumbleData
{
public float age { get; set; }
public float numberofherpictures { get; set; }
public float numberoflinesinbio { get; set; }
public float height { get; set; }
public float physicalactivity { get; set; }
public float education { get; set; }
public float drinking { get; set; }
public float smoking { get; set; }
public float wantchildren { get; set; }
public float havekids { get; set; }
public float politics { get; set; }
public float nils { get; set; }
public float profilenils { get; set; }
public float bionils { get; set; }
public float lookingnils { get; set; }
public float causenils { get; set; }
public float interestnils { get; set; }
// Include category as the label for training, but it will be ignored during inference
[ColumnName("category"), LoadColumn(12)]
public string category { get; set; }
}
public class BumblePrediction
{
public string PredictedLabel { get; set; }
[ColumnName("Score")]
public float[] Scores { get; set; }
}
}