Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การตรวจจับการฉ้อโกงใน Python


การฉ้อโกงมีจริงในหลายธุรกรรม เราสามารถใช้อัลกอริธึมการเรียนรู้ของเครื่องเพื่อโกหกข้อมูลในอดีตและคาดการณ์ความเป็นไปได้ที่ธุรกรรมจะเป็นธุรกรรมการฉ้อโกง ในตัวอย่างของเรา เราจะทำธุรกรรมด้วยบัตรเครดิต วิเคราะห์ข้อมูล สร้างคุณสมบัติและป้ายกำกับ และสุดท้ายใช้หนึ่งในอัลกอริธึม ML เพื่อตัดสินลักษณะของธุรกรรมว่าเป็นการฉ้อโกงหรือไม่ จากนั้นเราจะค้นพบความแม่นยำ ความแม่นยำ และ f-score ของโมเดลที่เราเลือก

การเตรียมข้อมูล

ในขั้นตอนนี้ เราอ่านข้อมูลต้นทาง ศึกษาตัวแปรที่มีอยู่ในนั้น และดูตัวอย่างข้อมูลบางส่วน ซึ่งจะช่วยให้เรารู้จักคอลัมน์ต่างๆ ในชุดข้อมูลและศึกษาคุณลักษณะต่างๆ เราจะใช้ Pandas is library เพื่อสร้าง data frame ที่จะใช้ในขั้นตอนต่อไป

ตัวอย่าง

นำเข้าแพนด้าเป็น pd#โหลด creditcard.csv โดยใช้ pandasdatainput =pd.read_csv('E:\\creditcard.csv')#https://www.kaggle.com/mlg-ulb/creditcardfraud# พิมพ์ด้านบน 5 บันทึกการพิมพ์(datainput[0:5],"\n")# พิมพ์รูปร่างที่สมบูรณ์ของการพิมพ์ชุดข้อมูล ("รูปร่างของชุดข้อมูลที่สมบูรณ์") พิมพ์ (datainput.shape,"\n")

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

 เวลา V1 V2 V3 ... V27 V28 จำนวน Class0 0.0 -1.359807 -0.072781 2.536347 ... 0.133558 -0.021053 149.62 01 0.0 1.191857 0.266151 0.166480 ... -0.008983 0.014724 2.69 02 1.0 -1.358354 -1.340163 1.773209 ... - 0.055353 -0.059752 378.66 03 1.0 -0.966272 -0.185226 1.792993 ... 0.062723 0.061458 123.50 04 2.0 -1.158233 0.877737 1.548718 ... 0.219422 0.215153 69.99 0[5 แถว x 31 คอลัมน์]รูปร่างของชุดข้อมูลที่สมบูรณ์ (284807, 31)

การตรวจสอบความไม่สมดุลในข้อมูล

ตอนนี้เราตรวจสอบวิธีการแจกจ่ายข้อมูลระหว่างธุรกรรมที่เป็นการฉ้อโกงและเป็นของแท้ ข้อมูลนี้ช่วยให้เราทราบว่าข้อมูลที่คาดว่าจะเป็นการฉ้อโกงมีกี่เปอร์เซ็นต์ ในอัลกอริธึม ml นี่เรียกว่าความไม่สมดุลของข้อมูล หากธุรกรรมส่วนใหญ่ไม่ใช่การฉ้อโกง ก็จะเป็นการยากที่จะตัดสินธุรกรรมบางรายการว่าเป็นของแท้หรือไม่ เราใช้คอลัมน์คลาสเพื่อนับจำนวนกลไกการฉ้อโกงในธุรกรรม จากนั้นหาเปอร์เซ็นต์ที่แท้จริงของธุรกรรมที่เป็นการฉ้อโกง

ตัวอย่าง

นำเข้าแพนด้าเป็น pd#โหลด creditcard.csv โดยใช้ pandasdatainput =pd.read_csv('E:\\creditcard.csv')false =datainput[datainput['Class'] ==1]true =datainput[datainput[ 'Class'] ==0]n =len(false)/float(len(true))print(n)print('False Detection กรณี:{}'.format(len(datainput[datainput['Class'] ==1])))print('กรณีการตรวจจับจริง:{}'.format(len(datainput[datainput['Class'] ==0])),"\n")

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

0.0017304750013189597 กรณีการตรวจจับเท็จ:492 กรณีการตรวจจับจริง:284315

รายละเอียดของประเภทธุรกรรม

เราตรวจสอบเพิ่มเติมเกี่ยวกับลักษณะของธุรกรรมสำหรับธุรกรรมที่ฉ้อโกงและไม่ฉ้อโกงแต่ละประเภท เราพยายามประมาณค่าพารามิเตอร์ต่างๆ ทางสถิติ เช่น ค่าเฉลี่ย ค่าสูงสุดของค่าเบี่ยงเบนมาตรฐาน ค่าต่ำสุด และค่าเปอร์เซ็นไทล์ที่ต่างกัน ทำได้โดยใช้วิธีการที่อธิบายไว้

ตัวอย่าง

นำเข้าแพนด้าเป็น pd#โหลด creditcard.csv โดยใช้ pandasdatainput =pd.read_csv('E:\\creditcard.csv')#ตรวจสอบความไม่สมดุลใน datafalse =datainput[datainput['Class'] ==1]true =datainput[datainput['Class'] ==0]#False Detection Casesprint("False Detection Cases")print("----------------------" )print(false.Amount.describe(),"\n")#True Detection Casesprint("กรณีการตรวจจับจริง")print("-------------------- --")print(true.Amount.describe(),"\n")

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

กรณีการตรวจจับเท็จ----------------------นับ 492.000000mean 122.211321std 256.683288 นาที 0.000000025% 1.00000050% 9.25000075% 105.890000max 2125.870000Name:จำนวน dtype:float64กรณีการตรวจจับจริง----------------------นับ 284315.000000mean 88.291022std 250.105092 นาที 0.000000025% 5.65000050% 22.00000075% 77.050000max 25691.160000Name:จำนวน dtype:float64 

การแยกคุณลักษณะและป้ายกำกับ

ก่อนที่เราจะใช้งานอัลกอริทึม ML เราต้องตัดสินใจเกี่ยวกับคุณสมบัติและป้ายกำกับ ซึ่งโดยทั่วไปหมายถึงการจัดหมวดหมู่ตัวแปรตามและตัวแปรอิสระ ในชุดข้อมูลของเรา คอลัมน์คลาสจะขึ้นอยู่กับคอลัมน์ที่เหลือทั้งหมด ดังนั้นเราจึงสร้าง data frames สำหรับคอลัมน์สุดท้าย เช่นเดียวกับ dataframe อื่นสำหรับส่วนที่เหลือของคอลัมน์อื่นทั้งหมด ดาต้าเฟรมเหล่านี้จะใช้ฝึกโมเดลที่เราจะสร้าง

ตัวอย่าง

นำเข้าแพนด้าเป็น pd#โหลด creditcard.csv โดยใช้ pandasdatainput =pd.read_csv('E:\\creditcard.csv')#separating features(X) and label(y)# เลือกคอลัมน์ทั้งหมดยกเว้นคอลัมน์สุดท้ายสำหรับทั้งหมด rowsX =datainput.iloc[:, :-1].values# เลือกคอลัมน์สุดท้ายของแถวทั้งหมดY =datainput.iloc[:, -1].valuesprint(X.shape)print(Y.shape)

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

(284807, 30)(284807,)

ฝึกโมเดล

ตอนนี้เราแบ่งชุดข้อมูลออกเป็นสองส่วน หนึ่งสำหรับการฝึกอบรมและอีกสำหรับการทดสอบ พารามิเตอร์ test_size ใช้เพื่อกำหนดเปอร์เซ็นต์ของชุดข้อมูลที่จะใช้สำหรับการทดสอบเท่านั้น แบบฝึกหัดนี้จะช่วยให้เรามั่นใจในแบบจำลองที่เรากำลังสร้าง

ตัวอย่าง

นำเข้าแพนด้าเป็น pdfrom sklearn.model_selection import train_test_split#Load the creditcard.csv using pandasdatainput =pd.read_csv('E:\\creditcard.csv')#separating features(X) and label(y)X =datainput iloc[:, :-1].values# เลือกคอลัมน์สุดท้ายของแถวทั้งหมดY =datainput.iloc[:, -1].values#train_test_split methodX_train, X_test, Y_train, Y_test =train_test_split(X, Y, test_size=0.2) 

การนำการจัดประเภทโครงสร้างการตัดสินใจไปใช้

มีอัลกอริธึมหลายประเภทที่สามารถนำไปใช้กับสถานการณ์นี้ได้ แต่เราเลือกแผนผังการตัดสินใจเป็นอัลกอริทึมสำหรับการจำแนกประเภท ซึ่งเป็นความลึกของต้นไม้สูงสุด 4 และจัดหาตัวอย่างทดสอบเพื่อทำนายค่า สุดท้าย เราคำนวณความถูกต้องของผลลัพธ์จากการทดสอบเพื่อตัดสินใจว่าจะใช้อัลกอริธึมนี้ต่อหรือไม่

ตัวอย่าง

นำเข้าแพนด้าเป็น pdfrom sklearn เมตริกการนำเข้าจาก sklearn.model_selection นำเข้า train_test_split#โหลด creditcard.csv โดยใช้ pandasdatainput =pd.read_csv('E:\\creditcard.csv')#separating features(X) และ label(y)X =datainput.iloc[:, :-1].valuesY =datainput.iloc[:, -1].values#train_test_split methodX_train, X_test, Y_train, Y_test =train_test_split(X, Y, test_size=0.2)#DecisionTreeClassifierfrom sklearn.tree นำเข้า DecisionTreeClassifierclassifier=DecisionTreeClassifier(max_depth=4)classifier.fit(X_train,Y_train)predicted=classifier.predict(X_test)print("\nค่าที่คาดการณ์ :\n",predicted)#AccuracyDT =metrics.accuracy_score(Y_test, ทำนายไว้) * 100print("\nคะแนนความถูกต้องโดยใช้ DecisionTreeClassifier :",DT)

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

ค่าที่ทำนาย :[0 0 0 ... 0 0 0]คะแนนความแม่นยำโดยใช้ DecisionTreeClassifier :99.936799719111

การค้นหาพารามิเตอร์การประเมิน

เมื่อระดับความแม่นยำในขั้นตอนข้างต้นเป็นที่ยอมรับ เราจะทำการประเมินแบบจำลองเพิ่มเติมโดยค้นหาพารามิเตอร์ต่างๆ ซึ่งใช้ความแม่นยำ ค่าการเรียกคืน และคะแนน F เป็นพารามิเตอร์ของเรา ความแม่นยำคือเศษส่วนของอินสแตนซ์ที่เกี่ยวข้องระหว่างอินสแตนซ์ที่ดึงมา ในขณะที่การเรียกคืนคือเศษส่วนของจำนวนอินสแตนซ์ที่เกี่ยวข้องทั้งหมดที่ดึงมาจริง คะแนน F ให้คะแนนเดียวที่สมดุลทั้งความกังวลของความแม่นยำและการเรียกคืนในตัวเลขเดียว

ตัวอย่าง

นำเข้าแพนด้าเป็น pdfrom sklearn import metricsfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import precision_scorefrom sklearn.metrics import Recall_scorefrom sklearn.metrics import f1_score#Load the creditcard.csv using pandasdatainput =pd.read_ccredits csv')#separating features(X) and label(y)X =datainput.iloc[:, :-1].valuesY =datainput.iloc[:, -1].values#train_test_split methodX_train, X_test, Y_train, Y_test =train_test_split(X, Y, test_size=0.2)#DecisionTreeClassifierfrom sklearn.tree import DecisionTreeClassifierclassifier=DecisionTreeClassifier(max_depth=4)classifier.fit(X_train,Y_train)predicted=classifier.predict(X_test)print("\nค่าที่คาดการณ์:\n" ,ทำนาย)## #AccuracyDT =metrics.accuracy_score(Y_test, ทำนาย) * 100print("\nคะแนนความถูกต้องโดยใช้ DecisionTreeClassifier :",DT)## #Precisionprint('precision')# Precision =TP / (TP + FP ) (โดยที่ TP =True Positive, TN =True Negative, FP =False Positive, FN =False Nega tive).ความแม่นยำ =precision_score(Y_test, ทำนาย, pos_label=1)print(precision_score(Y_test, ทำนาย, pos_label=1))#Recallprint('recall')# Recall =TP / (TP + FN)recall =Recall_score(Y_test , ทำนาย, pos_label=1)print(recall_score(Y_test, ทำนาย, pos_label=1))#f1-scoreprint('f-Score')# F - คะแนนเป็นวิธีการทางสถิติสำหรับกำหนดบัญชีความถูกต้องสำหรับทั้งความแม่นยำและการเรียกคืน fscore =f1_score(Y_test, ทำนาย, pos_label=1)print(f1_score(Y_test, ทำนาย, pos_label=1))

ผลลัพธ์

การเรียกใช้โค้ดข้างต้นทำให้เราได้ผลลัพธ์ดังต่อไปนี้ -

คะแนนความถูกต้องโดยใช้ DecisionTreeClassifier :99.9403110845827precision0.810126582278481recall0.7710843373493976f-Score0.7901234567901234