用人工智能实现一个技术的诈骗短信识别

用人工智能实现一个技术的诈骗短信识别 ML.net实现诈骗短信识别文章目录ML.net实现诈骗短信识别前言数据数据预处理和特征工程手动挡代码实现数据加载方法模型训练方法功能性测试性能测试切换自动挡数据加载模型训练功能性测试性能测试项目源码下载总结前言这是一个AI大爆发时代,只会写代码被淘汰是迟早的事,要跟上时代的脚步才不会被淘汰。下面我给大家简单讲解一下如何使用dotnet中的ML.net简单实现一个诈骗短信识别。数据在模型训练中,数据起到至关重要,数据比例如果不合理会导致模型预测偏差,如果数据量过少的话又会导致少数类样本可能被当作噪声或异常点,模型可能会过度拟合多数类的噪声,从而削弱对少数类的识别能力,模型难以从中学习到有效的特征表示,导致对少数类的泛化能力差下面我用来举例的数据比例是10%。也就是说正面数据和负面数据的比例是(10:1)这种数据可能会很大,建议放在clickhouse这种列式数据库中进行存储建议使用ReplacingMergeTree引擎。注意下面我们使用的是监督学习。也就是数据里会告诉模型那种短信是诈骗短信,那种短信是正常短信,让它从数据中学会辨别诈骗短信,这就和我们读书时候的找规律一个道理。数据预处理和特征工程这里主要用到两种回归L-BFGS 逻辑回归​和SDCA 逻辑回归这两种回归的主要区别特性维度L-BFGS 逻辑回归​SDCA 逻辑回归算法家族拟牛顿法​ (二阶优化方法)坐标上升法​ (一阶优化方法的对偶形式)求解空间在原始问题空间直接优化模型权重(w, b)在对偶问题空间优化拉格朗日乘子(α)计算开销/迭代中等偏高。需要计算和存储逆海森矩阵的近似(通常为O(md)或O(d²),m为记忆大小,d为特征数)。极低。每次只对一个样本对应的变量做计算,更新是标量运算,非常适合大规模数据。收敛速度超线性收敛。在接近最优解时非常快,通常需要的迭代次数很少。线性收敛。理论上收敛速度稳定,但实际中早期下降可能很快。主要优势①收敛所需迭代次数少。② 对参数调整(如学习率)不敏感,通常只需设置容差和迭代次数。③ 是中等规模数据(特征数万,样本数十万内)的强基准方法。① 单次迭代成本极低,非常适合超大规模数据集(样本数n极大)。② 有坚实的理论收敛保证。③ 实现简单高效,易于并行化/分布式化。主要劣势①每次迭代需要计算全batch或大批量的梯度,内存和计算开销随数据和特征增长较快。②不适合无法放入内存的超大规模数据。①最终求解的是对偶解,需转换回原始解(但转换是直接的)。②超线性收敛的理论优势不如L-BFGS。③对某些复杂正则化的处理不如原始方法方便。正则化处理在原始问题中处理L1或L2正则化非常自然。处理L2正则化极其自然和高效,这是SDCA的主要设计场景。处理L1正则化则需要对算法进行扩展。手动挡代码实现数据加载方法这里我处理得很粗暴直接从数据库里查询出来就是,我测试时说直接使用的mysql进行测试,没有去使用clickhouse,但是我建议数据还是放在clickhouse里要好一些,因为毕竟它是专业的大数据工具asyncTaskIEnumerableSmsDataLoadDataAsync(){stringconnectionString="server=127.0.0.1;database=test;uid=myroot;pwd=myroot;charset='gbk'";using(IDbConnectiondbConnection=newMySqlConnection(connectionString)){dbConnection.Open();stringselectSql="SELECT * FROM message";returnawaitdbConnection.QueryAsyncSmsData(selectSql);}//using (ClickHouseHelper helper = new ClickHouseHelper())//{// data = helper.ExecuteListSmsData("select * from Message");//}//return data;}模型训练方法asyncTaskModelTraining(){IEnumerableSmsDatadatas=awaitLoadDataAsync();intfraudCount=datas.Count(d=d.IsFraud);intnormalCount=datas.Count(d=!d.IsFraud);doubleproportion=(double)fraudCount/normalCount;Console.WriteLine($"诈骗样本数:{fraudCount}, 正常样本数:{normalCount}, 比例:{proportion:P2}");if(proportion0.1){Console.WriteLine("警告:数据比例不协调,(负数:正数据)应该为(1:10)");}// 创建 MLContextMLContextmlContext=new();IEstimatorITransformerpipeline;// 数据预处理和特征工程if(fraudCount+normalCount5000){//数据量小于5000用 L-BFGS 逻辑回归pipeline=mlContext.Transforms.Text.FeaturizeText("Features",nameof(SmsData.Text)).Append(mlContext.BinaryClassification.Trainers.LbfgsLogisticRegression(labelColumnName:nameof(SmsData.IsFraud),"Features"));}else{//大于五千用 SDCA 逻辑回归pipeline=mlContext.Transforms.Text.FeaturizeText("Features",nameof(SmsData.Text)).Append(mlContext.BinaryClassification.Trainers.SdcaLogisticRegression(labelColumnName:nameof(SmsData.IsFraud),"Features"));}IDataViewdataView=mlContext.Data.LoadFromEnumerable(datas);// 划分训练集和测试集varsplit=mlContext.Data.TrainTestSplit(dataView,testFraction:0.3);IDataViewtrainData