การทำนายการขายต่อเนื่องโดยใช้การเรียนรู้ของเครื่องใน Python

โหนดต้นทาง: 1079276

วัตถุประสงค์

  • ทำความเข้าใจว่า Cross-sell คืออะไรโดยใช้ข้อมูลประกันรถยนต์
  • เรียนรู้วิธีสร้างแบบจำลองสำหรับการทำนายการขายต่อเนื่อง

บทนำ

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

โปรเจ็กต์นี้ได้รับแรงบันดาลใจจากการเรียนรู้ของฉันจากหลักสูตรฟรีที่ครอบคลุมมากซึ่ง Analytics Vidhya เพิ่งเปิดตัว คุณสามารถหาลิงค์ด้านล่าง-

มาดำดิ่งลงไปในโครงการกัน

Cross-Sell Prediction คืออะไร?

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

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

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

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

คำชี้แจงปัญหาสำหรับปัญหาการทำนายผลการขายต่อเนื่อง

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

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

คำสั่งปัญหาและชุดข้อมูลสามารถเข้าถึงได้จาก แพลตฟอร์มแฮ็คข้อมูล Analytics Vidhya

คำจำกัดความของปัญหาระบุว่าเพื่อคาดการณ์ว่าลูกค้าจะสนใจประกันภัยรถยนต์หรือไม่ เรามีข้อมูลเกี่ยวกับข้อมูลประชากร (เพศ อายุ ประเภทรหัสภูมิภาค) ยานพาหนะ (อายุรถ ความเสียหาย) นโยบาย (พรีเมียม ช่องทางการจัดหา) ฯลฯ

การสร้างสมมติฐานสำหรับการทำนายขายต่อเนื่อง

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

แนวทางการคิดอย่างมีโครงสร้างจะช่วยเราได้ ให้ฉันระบุสมมติฐานบางอย่างจากคำชี้แจงปัญหาของเรา

  1. ลูกค้าผู้ชายมักจะซื้อประกันรถยนต์มากกว่าผู้หญิง
  2. ลูกค้าวัยกลางคนจะสนใจข้อเสนอประกันภัยมากกว่า
  3. ลูกค้าที่มีใบขับขี่มีแนวโน้มที่จะเปลี่ยนใจเลื่อมใสมากขึ้น
  4. ผู้ที่มีรถใหม่จะสนใจทำประกันมากกว่า
  5. ลูกค้าที่มีประกันรถอยู่แล้วจะไม่สนใจทำประกันอีก
  6. หากลูกค้าได้รับความเสียหายจากรถในอดีต ลูกค้าจะสนใจซื้อประกันภัยมากกว่า

ที่กล่าวมาข้างต้นเป็นเพียงตัวอย่างเล็กๆ น้อยๆ ของการสร้างสมมติฐาน คุณสามารถเพิ่มได้มากเท่าที่คุณต้องการ เมื่อคุณมีสมมติฐานพร้อมแล้ว ก็ถึงเวลาตรวจสอบข้อมูลและตรวจสอบความถูกต้องของข้อความ

การนำการทำนายการขายข้ามไปใช้ใน Python

ในส่วนนี้ เราจะมีการดำเนินการตามโครงการของเรา เราได้ดาวน์โหลดชุดข้อมูลจากแพลตฟอร์มแฮ็คข้อมูลในรูปแบบไฟล์ CSV ลองอ่านข้อมูลและดูว่ามีอะไรให้เราบ้าง

นำเข้าไลบรารี

นำเข้าหมีแพนด้าเป็น pd นำเข้าจำนวนเป็น np นำเข้า matplotlib.pyplot เป็น plt นำเข้าทะเลเป็น sns !pip ติดตั้ง imblearn จาก sklearn.metrics นำเข้าความถูกต้อง_score, f1_score,auc จาก sklearn.linear_model นำเข้า LogisticRegression จาก sklearn.tree นำเข้า DecisionTree Gridmodelselection นำเข้าจาก sklearn.tree จาก sklearn.ensemble นำเข้า RandomForestClassifier

การอ่านชุดข้อมูล

df= pd.read_csv('/content/train_data.csv') df.shape

ขั้นตอนแรกคือการดูแถวบนสุด 5 แถวใน dataframe ซึ่งจะทำให้เราเห็นภาพเริ่มต้นของข้อมูล

df.หัว()

ทำนายการขายต่อเนื่อง df-head

df.ข้อมูล()

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

ในชุดข้อมูลนี้ เรามี 12 คอลัมน์ของประเภทข้อมูลที่แตกต่างกัน เช่น int64, float64 และ object

ข้อมูลการทำนายการขายต่อเนื่อง

ตอนนี้ เราจะมองหาค่าใด ๆ ที่ขาดหายไปในชุดข้อมูลที่กำหนด

df.isna() 

ค่าที่ขาดหายไปในข้อมูล Cross-Sell Prediction

เราไม่มีค่าที่ขาดหายไปในข้อมูลนี้ ดังนั้นเราจึงสามารถไปยังขั้นตอนการวิเคราะห์ข้อมูลเชิงสำรวจได้

การวิเคราะห์ข้อมูลเชิงสำรวจ

ก่อนที่จะกระโดดเข้าสู่การสร้างแบบจำลองและสร้างโซลูชันที่ใช้การเรียนรู้ของเครื่องสำหรับปัญหาที่กำหนด สิ่งสำคัญคือต้องเข้าใจลักษณะพื้นฐานของข้อมูล

ตัวอย่างเช่น การแจกแจงคุณสมบัติเชิงตัวเลขคืออะไร? นอกจากนี้ EDA ยังมีส่วนในการตรวจสอบสมมติฐานของเราอีกด้วย

มะเดื่อ แกน = plt.subplots(2, 2, figsize=(10, 10)) 

sns.countplot(ax=axes[0,0],x='Gender',hue='Response',data=df,palette="mako") sns.countplot(ax=axes[0,1],x=) sns.countplot(ax=axes[1,0],x='Gender',hue='Response',data=df,palette="mako") sns.countplot(ax=axes[1,1] x= 'Driving_License',hue='Response',data=df,palette="mako") sns.countplot(ax=axes[XNUMX],x='Previously_Insured',hue='Response',data=df,จานสี ="mako") sns.countplot(ax=axes[XNUMX],x='Vehicle_Age',hue='Response',data=df,palette="mako")

แผนภูมิแท่งสำหรับข้อมูล Cross-Sell Prediction

จากการแสดงภาพด้านบน เราสามารถอนุมานได้ดังต่อไปนี้

ลูกค้าผู้ชายมียานพาหนะมากกว่าเล็กน้อยและมีแนวโน้มที่จะซื้อประกันมากกว่าผู้หญิง

ลูกค้าที่มีใบขับขี่ก็จะเลือกทำประกันแทนลูกค้าที่ไม่มี

ภาพที่สามแสดงให้เห็นว่าลูกค้าต้องการมีกรมธรรม์เท่านั้น หมายความว่าผู้ที่มีประกันอยู่แล้วจะไม่เปลี่ยนใจเลื่อมใส

ในแผนภูมิที่แล้ว ลูกค้าที่มีอายุรถน้อยกว่า 2 ปี มักจะซื้อประกันมากกว่า

sns.countplot(x='Vehicle_Damage',hue='Response',data=df,palette="mako") 

countplot สำหรับข้อมูลการทำนายการขายต่อเนื่อง

จากพล็อตข้างต้นเราสามารถอนุมานได้ว่าหากรถได้รับความเสียหายก่อนหน้านี้ลูกค้าจะสนใจซื้อประกันมากขึ้นเนื่องจากทราบราคา

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

ปัญหาที่กำหนดคือปัญหาความไม่สมดุลเนื่องจากตัวแปรการตอบสนองที่มีค่า 1 นั้นต่ำกว่าค่าศูนย์อย่างมาก

ตอบกลับ = df.loc[:,"Response"].value_counts().rename('Count') plt.xlabel("Response") plt.ylabel('Count') sns.barplot(Response.index , Response.values ,palette="mako")

พล็อตบาร์

ที่นี่เรามีการแจกแจงอายุ ลูกค้าส่วนใหญ่อยู่ในช่วงอายุ 20 ถึง 50 ปี ในทำนองเดียวกันเราสามารถเห็นการกระจายของเบี้ยประกันภัยรายปี

sns.displot(df['อายุ'])

sns.distplot(df['Annual_Premium'])

พล็อต

การประมวลผลข้อมูลล่วงหน้า

ขั้นตอนต่อไปในโครงการคือการเตรียมข้อมูลสำหรับการสร้างแบบจำลอง มีการใช้เทคนิคก่อนการประมวลผลต่อไปนี้ที่นี่

  1. แปลงคุณสมบัติที่เป็นหมวดหมู่เป็นหุ่นจำลองหรือทำการเข้ารหัสตามหมวดหมู่
  2. การรวมคุณสมบัติตัวเลข
  3. วางคอลัมน์ที่ไม่จำเป็นเช่นรหัส

ที่นี่เรามีฟังก์ชันที่ผู้ใช้กำหนด เราเพียงแค่ต้องส่ง dataframe ดิบและเราจะได้รับหนึ่ง preprocessed

def data_prep(df): df= df.drop(columns=['id','Policy_Sales_Channel','Vintage']) df=pd.get_dummies(df,columns=['Gender'] ,prefix='Gender') df=pd.get_dummies(df,columns=['Vehicle_Damage'] ,prefix='Damage') df=pd.get_dummies(df,columns=['Driving_License'] ,prefix='ใบอนุญาต') df=pd.get_dummies ( df,columns=['Previous_Insured'] ,prefix='prev_insured') df["Age"] = pd.cut(df['Age'], bins=[0, 29, 35, 50, 100]) df[ 'Age']= df['Age'].cat.codes df['Annual_Premium'] = pd.cut(df['Annual_Premium'], ถังขยะ=[0, 30000, 35000,40000, 45000, 50000, np inf]) df['Annual_Premium']= df['Annual_Premium'].cat.codes df['Vehicle_Age'] =df['Vehicle_Age'].map({'< 1 ปี': 0, '1-2 ปี ': 1, '> 2 ปี': 2}) df.drop(columns=['Region_Code'],inplace= True) return df df1=data_prep(df)
df1.หัว()

ข้อมูลหัว df1

เลือกคุณสมบัติ

ในโค้ดต่อไปนี้ เราจะเลือกคุณลักษณะเหล่านั้นเฉพาะที่เราต้องการใช้ในการฝึกอบรมแบบจำลองของเราเท่านั้น

คุณลักษณะ= ['อายุ','Vehicle_Age','Annual_Premium',"Gender_Female","Gender_Male","Damage_No","Damage_Yes", "License_0","License_1" ,"prev_insured_0", "prev_insured_1"]

แยกทดสอบรถไฟ

ในขั้นตอนต่อไป เราจะแบ่งข้อมูลทั้งหมดในมือออกเป็นข้อมูลรถไฟและข้อมูลทดสอบ

ข้อมูลรถไฟตามชื่อจะถูกนำมาใช้สำหรับการฝึกโมเดลการเรียนรู้ของเครื่อง ในทางกลับกัน การทดสอบ ข้อมูลจะถูกนำไปใช้ในการทำนายและทดสอบแบบจำลองที่ได้รับการฝึกอบรม

ที่นี่ ฉันได้เก็บข้อมูลทั้งหมดไว้ 30% สำหรับการทดสอบ และอีก 70% ที่เหลือจะถูกใช้สำหรับการฝึกโมเดล

จาก sklearn.model_selection นำเข้า train_test_split X_train, X_test, Y_train, Y_test = train_test_split(df1[Features],df1['Response'], test_size = 0.3, random_state = 101) X_train.shape,X_test.shape

รูปร่างของข้อมูล

จัดการปัญหาข้อมูลไม่สมดุล

จากการกระจายตัวแปรเป้าหมายในส่วน EDA เราทราบดีว่านี่เป็นปัญหาความไม่สมดุล ชุดข้อมูลที่ไม่สมดุลอาจมีความท้าทายในตัวเอง

ตัวอย่างเช่น แบบจำลองการทำนายโรคอาจมีความแม่นยำ 99% แต่ไม่มีประโยชน์หากไม่สามารถจำแนกผู้ป่วยได้สำเร็จ

เพื่อจัดการกับปัญหาดังกล่าว เราสามารถสุ่มตัวอย่างข้อมูลได้ ในโค้ดต่อไปนี้ เราจะใช้การสุ่มตัวอย่างต่ำ

การสุ่มตัวอย่างเป็นวิธีที่เราจะลดการเกิดขึ้นของคลาสส่วนใหญ่จนถึงจุดที่กำหนด

จาก imblearn.under_sampling นำเข้า RandomUnderSampler RUS = RandomUnderSampler(sampling_strategy=.5,random_state=3,) X_train,Y_train = RUS.fit_resample(df1[Features],df1['Response'])

Cross-Sell Prediction – การฝึกโมเดลและการทำนาย

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

สำหรับการวัดประสิทธิภาพ เราจะใช้คะแนนความถูกต้องและคะแนน F1 สิ่งสำคัญที่ควรทราบในที่นี้คือ สำหรับปัญหาการจำแนกที่ไม่สมดุล คะแนน F1 เป็นตัวชี้วัดที่สำคัญกว่า

def performance_met(รุ่น,X_train,Y_train,X_test,Y_test):

    acc_train=accuracy_score(Y_train, model.predict(X_train)) f1_train=f1_score(Y_train, model.predict(X_train)) acc_test=accuracy_score(Y_test, model.predict(X_test)) f1_test=f1_score(Y_test_ model.test(แบบทดสอบ) )) print("คะแนนการฝึก: ความแม่นยำ:{} f1:{}".format(acc_train,f1_train)) print("คะแนนการทดสอบ: ความแม่นยำ:{} f1:{}".format(acc_test,f1_test))

ในส่วนนี้ อันดับแรก เราจะฝึกสามรุ่น

  • การถดถอยโลจิสติก
  • ต้นไม้ตัดสินใจ
  • ป่าสุ่ม

การถดถอยโลจิสติก

model = LogisticRegression() model.fit(X_train,Y_train) performance_met(รุ่น,X_train,Y_train,X_test,Y_test) 

การถดถอยโลจิสติก

ต้นไม้ตัดสินใจ

model_DT=DecisionTreeClassifier(random_state=1) model_DT.fit(X_train,Y_train) Performance_met(model_DT,X_train,Y_train,X_test,Y_test)

ต้นไม้ตัดสินใจ

ป่าสุ่ม

Forest= RandomForestClassifier(random_state=1) Forest.fit(X_train,Y_train) performance_met(Forest,X_train,Y_train,X_test,Y_test)

ป่าสุ่ม

ในแบบจำลองทั้งหมด ประสิทธิภาพของแบบจำลองการถดถอยโลจิสติกนั้นต่ำมาก ในขณะที่แผนผังการตัดสินใจและแบบจำลองฟอเรสต์สุ่มแสดงประสิทธิภาพใกล้เคียงกันโดยประมาณ

การปรับไฮเปอร์พารามิเตอร์

สำหรับโปรเจ็กต์นี้ ขั้นตอนสุดท้ายคือการปรับแต่งไฮเปอร์พารามิเตอร์ เป็นกระบวนการในการค้นหาไฮเปอร์พารามิเตอร์ที่มีประสิทธิภาพดีที่สุด

ที่นี่ เราจะใช้อัลกอริธึม GridSearch เพื่อค้นหาพารามิเตอร์ที่ดีที่สุดของตัวแยกประเภทฟอเรสต์แบบสุ่ม

rf= RandomForestClassifier(random_state=1) พารามิเตอร์ = { 'bootstrap': [True], 'max_depth': [20, 25], 'min_samples_leaf': [3, 4], 'min_samples_split': [100,300], } grid_search_1 = GridSearchCV(rf, พารามิเตอร์, cv=3, verbose=2, n_jobs=-1) grid_search_1.fit(X_train, Y_train) performance_met(grid_search_1,X_train,Y_train,X_test,Y_test)

ผลลัพธ์การค้นหาตาราง

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

สรุป

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

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

หากคุณต้องการเรียนรู้แมชชีนเลิร์นนิงตั้งแต่เริ่มต้น ที่นี่ เรามีหลักสูตรฟรีสำหรับคุณ-

ที่มา: https://www.analyticsvidhya.com/blog/2021/09/cross-sell-prediction-using-machine-learning-in-python/

ประทับเวลา:

เพิ่มเติมจาก การวิเคราะห์ วิทยา