python采购风控-采购异常单价logistic算法实现及打标签注意事项

该文介绍了一种结合统计学(3sigma和箱线图)和机器学习(有监督学习的逻辑回归)的方法来识别异常采购单价。首先,通过统计方法筛选异常数据,然后针对异常采购人打标签,创建训练样本。使用Logistic回归模型,以规格id、小单位数量和入库裸价为特征,实现了正负样本平衡的训练集和测试集,并评估了模型的准确率。
摘要由CSDN通过智能技术生成

项目描述

现在想用机器学习中的有监督学习算法来识别采购异常单价,但是问题是缺少打标签的数据。因此,首先,使用统计学(3sigma以及箱线图)的方法分别得到异常单项,取这两种方法的交集,然后按采购人汇总,发现数据还是很多,故取交集中的前10%的数据,得到异常数据。

打标签

  • Top10%的采购人,到3sigma(或箱线图)异常表中获取这些采购人下的所有异常单项,视为error=1的,放入表格data_false;
  • 在原始表格中删去error=1的这些数据,那么得到的就是正常的数据了,放入data_true.
  • 注意 这里如果使用循环遍历就比较麻烦了。我使用的办法是将异常的那张表格数据(data_false)加入到原始表格中,然后删除重复的数据,注意调一下参数,重复的均删除.
  • 具体实现:
import xlrd
import numpy as np
import pandas as pd
import math
df = pd.read_excel('total.xlsx',error_bad_lines=False) #原始数据
df1 = pd.read_excel('top10.xls')
top10 = df1['采购人'].unique() #全国的数据
for i in range(len(top10)):
    top_name = top10[i]
    df2 = df[df['采购人'] == top10[i]]
    df2['error'] =1
    df2.to_csv("test0909.csv",mode = 'a',header=False,encoding="utf_8_sig") #追加写入,不写入表头,header=False
    print("已读取到第%d个异常值" %i)
print("写入完毕")
df3 = pd.read_csv('test0909.csv',error_bad_lines=False) #有25列 维度不一样
df4 = df3[['城市','入库单号','采购人','入库时间','仓库','productskuid','产品名称','规格id','品牌','类目组','一级类目','采购金额','件数','小单位数量','小单位单价','入库裸价','省份']] #选取指定的列
df4.to_csv("test0909_error_17columns.csv",mode = 'a',encoding="utf_8_sig" )
df5=df.append(df4)
df5.drop_duplicates(keep=False,inplace=True) #drop_duplicates当中的参数keep=False,意为重复项全部删除,它还有keep="first"与keep="last",分别对应在有多项重复时,保留第一项(或最后一项)
df3.reset_index()
  • 再重复一下:drop_duplicates当中的参数keep=False,意为重复项全部删除,它还有keep="first"与keep=“last”,分别对应在有多项重复时,保留第一项(或最后一项)

logistic实现

  • 正负样本比例1:1(25000:24831);训练集、测试集比例7:3。
  • 选取了三个维度:规格id;小单位数量;入库裸价进行logistic回归
#logistic
from sklearn import svm
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
import numpy as np

file= open("data_3dimension_0910_100000.csv",'r', encoding='UTF-8')
data = np.loadtxt(file, skiprows=(1),delimiter=',')

x, y = np.split(data, (4,), axis=1)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.7)
sc = StandardScaler()
sc.fit(x_train)
x_train_std = sc.transform(x_train)
x_test_std = sc.transform(x_test)

#x_combined_std = np.vstack((x_train_std, x_test_std))
#y_combined = np.hstack((y_train, y_test))

classifier = LogisticRegression(C = 100,solver='newton-cg', random_state=0)
classifier.fit(x_train_std, y_train.ravel())
#yPredict=c.predict(x_test_std)
print("训练集的准确率:",classifier.score(x_train_std, y_train))  # 训练集的准确率
print("测试集的准确率:",classifier.score(x_test_std, y_test)) # 测试集的准确率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值