การวัดความแม่นยำของแบบจำลองการถดถอยโลจิสติก


26

ฉันมีแบบจำลองการถดถอยโลจิสติกที่ผ่านการฝึกอบรมซึ่งฉันใช้กับชุดข้อมูลการทดสอบ ตัวแปรที่ขึ้นต่อกันคือไบนารี (บูลีน) สำหรับแต่ละตัวอย่างในชุดข้อมูลการทดสอบฉันใช้แบบจำลองการถดถอยโลจิสติกเพื่อสร้าง% ความน่าจะเป็นที่ตัวแปรตามจะเป็นจริง จากนั้นฉันบันทึกว่าค่า acutal เป็นจริงหรือเท็จ ฉันพยายามคำนวณรูปหรือ Adjustedเหมือนในตัวแบบถดถอยเชิงเส้นR2R2

นี่ทำให้ฉันบันทึกสำหรับตัวอย่างแต่ละตัวอย่างในชุดการทดสอบที่ชอบ:

prob_value_is_true         acutal_value
   .34                          0
   .45                          1
   .11                          0
   .84                          0
    ....                        ....          

ฉันสงสัยว่าจะทดสอบความแม่นยำของแบบจำลองได้อย่างไร ความพยายามครั้งแรกของฉันคือการใช้ตารางฉุกเฉินและพูดว่า "ถ้าprob_value_is_true> 0.80 เดาว่ามูลค่าจริงเป็นจริง" จากนั้นวัดอัตราส่วนที่ถูกต้องต่อการจำแนกประเภทที่ไม่ถูกต้อง แต่ฉันไม่ชอบเพราะมันให้ความรู้สึกมากกว่าฉันแค่ประเมิน 0.80 เป็นขอบเขตไม่ใช่ความแม่นยำของโมเดลโดยรวมและในทุกprob_value_is_trueค่า

จากนั้นฉันพยายามดูแต่ละค่า prob_value_is_true โดยสิ้นเชิงเป็นตัวอย่างดูตัวอย่างทั้งหมดที่prob_value_is_true= 0.34 และการวัด% ของตัวอย่างเหล่านั้นโดยที่ค่า acutal เป็นจริง (ในกรณีนี้ความแม่นยำสมบูรณ์จะเป็นถ้า% ของตัวอย่าง นั่นเป็นความจริง = 34%) prob_value_is_trueฉันอาจจะสร้างคะแนนความถูกต้องได้จากข้อสรุปรูปแบบที่แตกต่างกันในแต่ละคุ้มค่าต่อเนื่องของ แต่ขนาดของกลุ่มตัวอย่างมีความกังวลอย่างมากโดยเฉพาะอย่างยิ่งในส่วนที่เกิน (ใกล้ 0% หรือ 100%) เช่นนั้นค่าเฉลี่ยของค่าอคิวตัลนั้นไม่ถูกต้องดังนั้นการใช้พวกมันในการวัดความแม่นยำของแบบจำลองนั้นไม่ถูกต้อง

ฉันยังพยายามสร้างช่วงขนาดใหญ่เพื่อให้แน่ใจว่ามีขนาดตัวอย่างที่เพียงพอ (0-.25, .25-.50, .50-.75, .75-1.0) แต่จะวัด "ดี" ของ% ของมูลค่าจริงได้หรือไม่ . พูดตัวอย่างทั้งหมดที่prob_value_is_trueอยู่ระหว่าง 0.25 ถึง 0.50 มีค่าเฉลี่ยacutal_value0.45 ดีตั้งแต่อยู่ในช่วงหรือไม่ ไม่ดีเนื่องจากไม่ใกล้ 37.5% (จุดศูนย์กลางของช่วง)

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


ฉันคิดว่าตัวอย่างช่วง: (0-.25, .25-.50, .50-.75, .75-1.0) เข้าท่า จะเป็นประโยชน์หรือไม่ถ้าคุณ จำกัด ช่วงให้แคบลง เช่น: 0-.03, .03-.06, .06-.09, ..... กล่าวคือทุกๆ. 03 สิ่งนี้อาจมีประโยชน์สำหรับภูมิภาคที่มีจุดข้อมูลมากมาย
แม็ค

คำตอบ:


18

การวัดที่มักใช้ในการตรวจสอบความถดถอยโลจิสติกส์คือ AUC ของเส้นโค้ง ROC (พล็อตของความไวต่อ 1-specificity - เพียง google สำหรับคำหากจำเป็น) โดยพื้นฐานแล้วสิ่งนี้จะประเมินช่วงของค่าเกณฑ์ทั้งหมด

ข้อเสีย: การประเมินช่วงค่าทั้งหมดอาจไม่ใช่สิ่งที่คุณทำหลังจากนี้ (โดยทั่วไป) รวมถึงขีด จำกัด ที่ส่งผลให้เกิดค่าลบจำนวนมากหรือผลบวกปลอม มีรุ่นของ AUC ที่บัญชีนี้ (บางส่วนของ AUC) ดังนั้นหากเป็นปัญหาสำหรับคุณคุณสามารถดูได้


1
การพัก AUC สักครู่ฉันถูกต้องหรือไม่ถ้าสมมติว่าการก่อสร้าง ROC Curve เป็นเช่นนี้ สำหรับแต่ละค่าที่ไม่ต่อเนื่องของ prob_value_is_true ให้สร้างหนึ่งตารางฉุกเฉินโดยใช้ค่าแยกเป็นเกณฑ์ จากนั้นบันทึกอัตราการบวกที่แท้จริงและอัตราการบวกที่ผิดพลาดของแต่ละตารางฉุกเฉิน พล็อตอัตราสำหรับตาราง contingnency ทั้งหมดบน scatterplot และคุณควรเห็น ROC curve? เสียงนั้นใช่ไหม
John Reed

ฉันรวบรวมรหัสเพื่อทำสิ่งนี้เพียงป้อนค่าสุ่มเป็นความน่าจะเป็นและค่าจริงและมันก็เป็นเส้นตรง ฉันคิดว่า AUC กำลังวัดความเบี่ยงเบนของ "ส่วนโค้ง" จากแบบจำลองที่ได้รับการติดตั้งนั้น "บรรทัด" หรือการสุ่ม?
John Reed

เกี่ยวกับ ROC: ใช่ถูกต้องแล้ว มีตัวแปรบางอย่าง (ปรับให้เรียบมากขึ้นหรือน้อยลงโดยคำนึงถึงความน่าจะเป็นที่คาดการณ์ไว้สำหรับเกณฑ์ที่คุณเลือกหรือไม่) โปรดทราบว่า (ขึ้นอยู่กับซอฟต์แวร์ / ภาษาที่คุณใช้) มีเครื่องมือมากมายที่ให้สิ่งนี้แล้ว Wrt AUC: ไม่มากหรือน้อยกว่าพื้นที่จริงภายใต้เส้นโค้ง ROC ไม่ใช่ด้วยการทำนายแบบสุ่มที่สมบูรณ์แบบเส้นโค้ง ROC จะเป็นเส้นตรงจาก (0,0) ถึง (1,1) ทำให้เกิด AUC 0.5 AUC มีการตีความที่ดีบางอย่าง (ดู Google หรือ Wikipedia แม้ :-))
Nick Sabbe

8

คุณถูกต้องที่จะต้องกังวลเกี่ยวกับสัดส่วนที่ถูกต้องซึ่งสะท้อนถึงผลกระทบของขอบเขตโดยพลการ ฉันขอแนะนำสองมาตรการ หนึ่งคือพื้นที่ -index หรือ ROC ตามที่คนอื่น ๆ ได้อธิบายไว้ สิ่งนี้มีการตีความที่ง่ายกว่าการคิดถึงเส้นโค้ง ROC และเป็นการวัดการเลือกปฏิบัติที่สามารถคาดการณ์ได้อย่างบริสุทธิ์ ประการที่สองประมาณการเส้นโค้งการปรับเทียบอย่างต่อเนื่องโดยไม่ต้องใช้ข้อมูลใด ๆ หากการคาดการณ์กำลังได้รับการประเมินในชุดข้อมูลอิสระคุณสามารถใช้กับการตรวจจับนอกที่ถูกปิดเพื่อประเมินความสัมพันธ์ระหว่างการทำนายและ Prob ที่เกิดขึ้นจริง [Y = 1] ฟังก์ชั่นใน R แพ็กเกจจะทำทั้งสองสิ่งเหล่านี้ ฟังก์ชั่นอื่น ๆ ในclowessval.probrmsrms จะทำเช่นเดียวกันสำหรับการตรวจสอบภายในโดยใช้การ resampling เพื่อลบผลกระทบของการ overfitting


6

หากข้อมูลของคุณถูกจัดกลุ่มตามค่าคุณสามารถคำนวณแบบจำลองที่คาดการณ์มูลค่าและเป็นช่วงความเชื่อมั่นที่เกี่ยวข้องและดูว่าเปอร์เซ็นต์ที่สังเกตได้อยู่ในช่วงนั้นหรือไม่ ตัวอย่างเช่นถ้าคุณมี 10 ข้อสังเกตที่x = 10 , 10 OBS ที่x = 20 , 10 OBS ที่x = 30ฯลฯ แล้ว, ฯลฯ จะให้ผลผลิตเปอร์เซ็นต์ที่สามารถนำมาเปรียบเทียบกับการคาดการณ์ โปรดจำไว้ว่าแม้ว่าโมเดลจะสมบูรณ์แบบ แต่เปอร์เซ็นต์ที่สังเกตได้บางอย่างจะเด้งออกมาจาก 95% CI เช่นเดียวกับ OLS regression หากข้อมูลของคุณไม่ได้ถูกจัดกลุ่มคุณสามารถสร้างกลุ่มของคุณเองโดยการ binning ข้อมูลตามช่วงของxxx=10x=20x=30mean(y[x==10]==1)mean(y[x==20]==1)xตัวแปรตามที่คุณแนะนำ สิ่งนี้ไม่ถูกต้องอย่างสมบูรณ์เนื่องจากมันจะขึ้นอยู่กับการเลือกถังขยะซึ่งจะเป็นประโยชน์ในการสำรวจรูปแบบของคุณ

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

y=1y^.5y=1y^p(y=1)y^=.31y1<.5

(0,1)R2R2c


คำตอบที่ดี! ในตัวอย่างที่ 30% ของทุกกรณีเป็น 1 ความน่าจะเป็นที่คาดการณ์ไว้ 0.31 ของกรณีใดกรณีหนึ่งเป็นเหมือน "อันดับ" ของกรณีนี้เมื่อเทียบกับกรณีอื่น ๆ ว่าใกล้ถึง 1 (ยิ่งใหญ่ยิ่งเข้ามา) และไม่ควรถูกมองว่าเป็นความน่าจะเป็นที่คาดการณ์ว่ากรณีนี้จะเป็น 1
แม็ค

1
y^i=.311.31.31.25

3

ฉันคิดว่าคุณสามารถสร้างเกณฑ์ (พูด 0.5) ดังนั้นเมื่อความน่าจะเป็นของคุณเท่ากับหรือสูงกว่าเกณฑ์นั้นระดับที่คาดการณ์ของคุณจะเป็น 1 และ 0 เป็นอย่างอื่น จากนั้นคุณสามารถวัดความแม่นยำได้ด้วยวิธีนี้:

confusion_matrix <- ftable(actual_value, predicted_value)
accuracy <- sum(diag(confusion_matrix))/number of events*100

เนื่องจากความน่าจะเป็นของคุณคือความน่าจะเป็นที่ได้รับข้อมูลของคุณ (x) และใช้แบบจำลองของคุณค่าคลาส (y) เท่ากับ 1 ฉันไม่เข้าใจว่าทำไมคุณถึงได้ค่าความน่าจะเป็นต่ำกว่า 0.5 เสมอ ความถี่ใดของคลาสจริงของคุณ (actual_value)


2

คุณอาจต้องการดูแพ็คเกจของฉันsoftclassval(ที่ softclassval.r-forge.r-project.org คุณจะพบการนำเสนอปากเปล่าทั้งสองที่ฉันได้ให้เกี่ยวกับแนวคิดเบื้องหลังแพ็คเกจ)

ฉันเขียนมันสำหรับปัญหาที่แตกต่างกันเล็กน้อยคือถ้าการอ้างอิง (เช่นอายุรเวช) "ปฏิเสธ" เพื่อให้ชั้นเรียนที่ชัดเจน อย่างไรก็ตามคุณสามารถใช้กับคลาสที่ยาก "ปกติ" ได้และจะหลีกเลี่ยงคำจำกัดความของเกณฑ์สำหรับการคาดการณ์ที่ต่อเนื่องในตอนแรกดังนั้นคุณจึงไม่ได้ประเมิน 0.8

อย่างไรก็ตามฉันแนะนำให้ใช้ร่วมกับ, บอก, ROC หรือ specificity-sensitivity-diagram: ผลลัพธ์มักจะดูไม่ดีนักเนื่องจากวิธีการ "ของฉัน" จะลงโทษความเบี่ยงเบนเล็กน้อยอยู่แล้ว (เช่น 0.9 แทนที่จะเป็น 1 ให้ 0.1 ต่างกันสำหรับมาตรการของฉัน แต่เกณฑ์ทั้งหมดที่ต่ำกว่า 0.9 จะไม่สนใจสิ่งนี้) อันที่จริงฉันคิดว่าค่อนข้างเป็นข้อได้เปรียบ: การขาดความไวอ่อนไหวเล็กน้อยนี้เป็นหนึ่งในประเด็นสำคัญของการวิพากษ์วิจารณ์กับมาตรการที่ "แข็ง" เช่นความแม่นยำความไวการเรียกคืน ฯลฯ

นอกจากนี้โดยการเปรียบเทียบข้อผิดพลาดค่าสัมบูรณ์แบบสัมบูรณ์ (MAE) และค่าเฉลี่ยของข้อผิดพลาดกำลังสอง RMSE คุณสามารถทราบได้ว่าคุณมีความเบี่ยงเบนเล็กน้อยหรือตัวอย่างที่ผิดพลาดน้อยกว่าหรือไม่


1

Pri=invlogit(a+bxi)

y.rep[i]Bernoulli(p[i])

จากนั้นเรียกใช้การจำลองนี้พูด 100 ครั้ง คุณจะมีเมทริกซ์ที่มี n แถว (n คือจำนวนวิชา) และคอลัมน์ k (ในกรณีนี้คือ k = 100, จำนวนการจำลอง) ในรหัส r:

for (j  in 1:100)
  mat.y.rep[,j] <- Bernoulli ( p) # p is a vector with a probability for each subject

ตอนนี้คุณคำนวณความแตกต่างระหว่างการทำนายในแต่ละการจำลองและการสังเกต หลังจากคำนวณความแตกต่างนี้ให้คำนวณจำนวนค่าเฉลี่ยของค่าบวกจริงและค่าลบบวกสำหรับแต่ละแถว (แต่ละวิชา) แล้วพล็อตกราฟฮิสโตแกรม หรือคำนวณทั้งสองสำหรับแต่ละคอลัมน์ (จำลอง) e เขียนกราฟฮิสโตแกรม (ฉันชอบสิ่งนี้)

หวังว่ามันจะช่วย ...


1

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

ตัวอย่างเช่นหากคุณวางแผนที่จะเลือกคะแนนความนิยมสูงสองสามครั้งสำหรับการศึกษาติดตามราคาแพงคุณอาจต้องการเพิ่มความแม่นยำให้ได้คะแนนสูงสุด ในทางกลับกันหากการศึกษาติดตามราคาถูกคุณอาจต้องการเพิ่มการเรียกคืน (ความไว) ให้ได้คะแนนต่ำที่สุด ROC AUC อาจเหมาะสมถ้าคุณเปรียบเทียบวิธีอื่น ๆ

ในด้านการปฏิบัติRของROCRแพคเกจที่มีฟังก์ชั่นที่มีประโยชน์ 2

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

ฟังก์ชั่นเหล่านี้สามารถคำนวณการวัดความแม่นยำที่หลากหลายรวมถึงค่าสเกลาร์โกลบอล (เช่น"auc" ) และเวกเตอร์ขึ้นอยู่กับคะแนนสำหรับการพล็อต Recall-precision และเส้นโค้ง ROC ( "prec" , "rec" , "tpr"และ"fpr"ฯลฯ )


1

คุณต้องกำหนดสิ่งที่คุณหมายถึงโดย "ความถูกต้อง" สิ่งที่คุณต้องการทราบโปรดยกโทษให้ฉันด้วยการใส่คำเข้าไปในปากของคุณว่าแบบจำลองของคุณเหมาะสมกับข้อมูลการฝึกอบรมอย่างไรและที่สำคัญกว่านั้นโมเดลนี้ "ทั่วไป" กับตัวอย่างที่ไม่ได้อยู่ในข้อมูลการฝึกอบรมของคุณ แม้ว่า ROC curves จะมีประโยชน์ในการวิเคราะห์การแลกเปลี่ยนระหว่างความแม่นยำและการเรียกคืนสำหรับค่าต่าง ๆ ของขีด จำกัด แต่ฉันขอแนะนำให้เพิ่มค่าเฉลี่ยกำลังสองข้อผิดพลาดหรือคะแนน Brier ไปยังกล่องเครื่องมือของคุณ ง่ายต่อการคำนวณและคุณสามารถรับรู้ได้ทันทีว่าการเปลี่ยนแปลงคุณสมบัติมีผลต่อความพอดีของโมเดลหรือไม่เมื่อใช้กับข้อมูลการฝึกอบรม ในกรณีนี้มีความเหมาะสมมากเกินไปงานของคุณจึงยังไม่เสร็จ ในการประเมินประสิทธิภาพการวางนัยทั่วไปหรือวิธีการที่คุณทำกับข้อมูลที่คุณไม่ได้เห็นเป็นอย่างดี ไม่เพียงพอที่จะดูประสิทธิภาพของคุณในตัวอย่างการฝึกอบรม แน่นอนว่าแบบจำลองของคุณดีสำหรับสิ่งเหล่านั้นเพราะมันเป็นค่าที่คุณใช้ในการกำหนดค่าสัมประสิทธิ์ของโลจิสติกส์ คุณต้องตั้งตัวอย่างสำหรับข้อมูลการทดสอบ ประสิทธิภาพ MSE ของคุณในชุดนี้ควรตั้งค่าความคาดหวังทั่วไปของคุณตามความไม่เท่าเทียมกันของ Hoeffding ข้อผิดพลาดในการวางนัยทั่วไปสูงสุดของคุณจะขึ้นอยู่กับจำนวนของคุณสมบัติในโมเดลของคุณรวมถึงจำนวนตัวอย่างที่ใช้ในการคำนวณสถิติการทดสอบ โปรดระวังว่าคุณจะต้องขโมยตัวอย่างการฝึกซ้อมของคุณสำหรับตัวอย่างทดสอบ ฉันขอแนะนำการตรวจสอบความถูกต้องไขว้ 10 เท่าโดยที่คุณสุ่มเลือก 90% สำหรับการฝึกอบรม 10% สำหรับการทดสอบจากนั้นทำการวัดทำซ้ำแล้วเฉลี่ยการวัดทั้งหมด เพราะมันคือค่าที่คุณใช้ในการกำหนดค่าสัมประสิทธิ์ของโลจิสติกส์ คุณต้องตั้งตัวอย่างสำหรับข้อมูลการทดสอบ ประสิทธิภาพ MSE ของคุณในชุดนี้ควรตั้งค่าความคาดหวังทั่วไปของคุณตามความไม่เท่าเทียมกันของ Hoeffding ข้อผิดพลาดในการวางนัยทั่วไปสูงสุดของคุณจะขึ้นอยู่กับจำนวนของคุณสมบัติในโมเดลของคุณรวมถึงจำนวนตัวอย่างที่ใช้ในการคำนวณสถิติการทดสอบ โปรดระวังว่าคุณจะต้องขโมยตัวอย่างการฝึกซ้อมของคุณสำหรับตัวอย่างทดสอบ ฉันขอแนะนำการตรวจสอบความถูกต้องไขว้ 10 เท่าโดยที่คุณสุ่มเลือก 90% สำหรับการฝึกอบรม 10% สำหรับการทดสอบจากนั้นทำการวัดทำซ้ำแล้วเฉลี่ยการวัดทั้งหมด เพราะมันคือค่าที่คุณใช้ในการกำหนดค่าสัมประสิทธิ์ของโลจิสติกส์ คุณต้องตั้งตัวอย่างสำหรับข้อมูลการทดสอบ ประสิทธิภาพ MSE ของคุณในชุดนี้ควรตั้งค่าความคาดหวังทั่วไปของคุณตามความไม่เท่าเทียมกันของ Hoeffding ข้อผิดพลาดในการวางนัยทั่วไปสูงสุดของคุณจะขึ้นอยู่กับจำนวนของคุณสมบัติในโมเดลของคุณรวมถึงจำนวนตัวอย่างที่ใช้ในการคำนวณสถิติการทดสอบ โปรดระวังว่าคุณจะต้องขโมยตัวอย่างการฝึกซ้อมของคุณสำหรับตัวอย่างทดสอบ ฉันขอแนะนำการตรวจสอบความถูกต้องไขว้ 10 เท่าโดยที่คุณสุ่มเลือก 90% สำหรับการฝึกอบรม 10% สำหรับการทดสอบจากนั้นทำการวัดทำซ้ำแล้วเฉลี่ยการวัดทั้งหมด ประสิทธิภาพ MSE ของคุณในชุดนี้ควรตั้งค่าความคาดหวังทั่วไปของคุณตามความไม่เท่าเทียมกันของ Hoeffding ข้อผิดพลาดในการวางนัยทั่วไปสูงสุดของคุณจะขึ้นอยู่กับจำนวนของคุณสมบัติในโมเดลของคุณรวมถึงจำนวนตัวอย่างที่ใช้ในการคำนวณสถิติการทดสอบ โปรดระวังว่าคุณจะต้องขโมยตัวอย่างการฝึกซ้อมของคุณสำหรับตัวอย่างทดสอบ ฉันขอแนะนำการตรวจสอบความถูกต้องไขว้ 10 เท่าโดยที่คุณสุ่มเลือก 90% สำหรับการฝึกอบรม 10% สำหรับการทดสอบจากนั้นทำการวัดทำซ้ำแล้วเฉลี่ยการวัดทั้งหมด ประสิทธิภาพ MSE ของคุณในชุดนี้ควรตั้งค่าความคาดหวังทั่วไปของคุณตามความไม่เท่าเทียมกันของ Hoeffding ข้อผิดพลาดในการวางนัยทั่วไปสูงสุดของคุณจะขึ้นอยู่กับจำนวนของคุณสมบัติในโมเดลของคุณรวมถึงจำนวนตัวอย่างที่ใช้ในการคำนวณสถิติการทดสอบ โปรดระวังว่าคุณจะต้องขโมยตัวอย่างการฝึกซ้อมของคุณสำหรับตัวอย่างทดสอบ ฉันขอแนะนำการตรวจสอบความถูกต้องไขว้ 10 เท่าโดยที่คุณสุ่มเลือก 90% สำหรับการฝึกอบรม 10% สำหรับการทดสอบจากนั้นทำการวัดทำซ้ำแล้วเฉลี่ยการวัดทั้งหมด


1

0log(1p^)01log(p^)1

สิ่งนี้ไม่ได้เกิดจากเกณฑ์ที่กำหนดเอง ยิ่งขนาดเล็กยิ่งวัดยิ่งดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.