Xgboost: [рдЪрд░реНрдЪрд╛] PySpark рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдЕрдХреНрддреВре░ 2016  ┬╖  53рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: dmlc/xgboost

рдореИрдВрдиреЗ рдЕрднреА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ PySpark рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрдиреБрд░реЛрдз рд╣реИрдВ http://dmlc.ml/2016/03/14/xgboost4j-portable-distributed-xgboost-in-spark-flink-and-dataflow.html

рдореБрдЭреЗ рдЗрд╕реА рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рдХреБрдЫ рдИрдореЗрд▓ рднреА рдкреНрд░рд╛рдкреНрдд рд╣реБрдП рд╣реИрдВ

рдореИрдВ рдпрд╣рд╛рдВ рдПрдХ рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдо рдЗрд╕ рдХрд╛рдо рдХреЛ рдХрдм рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ?

@tqchen @terrytangyuan

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@CodingCat @tqchen рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рд╕рдореБрджрд╛рдп рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ PySpark рдореЗрдВ XGboost рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐:

  • рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдорд╛рд░реНрдЪ 2017 рддрдХ рдкрд╛рдпрдерди #3 рднрд╛рд╖рд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ 10.2% рд╣реИ (рд╕реНрдХреИрд▓рд╛ рдХреЗ рд▓рд┐рдП 1.8% рдмрдирд╛рдо)
    http://redmonk.com/sogrady/2017/03/17/language-rankings-1-17/
    https://jobsquery.it/stats/language/group;
  • рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдмрдирд╛рдо рд╕реНрдХреИрд▓рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рд╕реНрдХреИрд▓рд╛ рд╣реИ, рд╣реИ рдирд╛?
  • рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо, 3 рдПрдЖрдИ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЬреЛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рдЖрдорддреМрд░ рдкрд░, рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдиреМрдХрд░реА рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдорд╛рдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ (
    http://r4stats.com/articles/popularity/)
    рдореЗрд░рд╛ рдирд┐рд╖реНрдХрд░реНрд╖: PySpark рдореЗрдВ рд▓рд╛рдЧреВ XGboost рдХрд╛ рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рдмреАрдЪ DataScience рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ред
    (PS рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, Cloudera рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ)

рд╕рднреА 53 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@CodingCat рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ PySpark рд╕рдореБрджрд╛рдп рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реИ? рдЬреНрдпрд╛рджрд╛рддрд░ рд▓реЛрдЧ рд╕рд┐рд░реНрдл рд╕реНрдХреИрд▓рд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдпрдерди рдореЗрдВ рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ - рдЕрдЧрд░ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рд╕реБрдзрд╛рд░реЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдХрд╛рдлреА рдкреНрд░рдЪрд▓рд┐рдд рд╣реИ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рддреНрд╡рд░рд┐рдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЖрджрд┐ рдХреЗ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВред рдореИрдВрдиреЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pySpark рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рджреВрд╕рд░реА рдУрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрддреНрдкрд╛рджрди-рд╕реНрддрд░ рдкрд░рд┐рджреГрд╢реНрдп рд╕реНрдХрд╛рд▓рд╛ рдПрдкреАрдЖрдИ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдорд╛рдорд▓рд╛ рдкрддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдкрд╛рдпрд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ)

рд╣рд╛рдБ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдЬрд░реВрд░рддреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рд╣рдо рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рд╕рд╛рдорд╛рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реВрдВред рд╢рд╛рдпрдж рд╣рдореЗрдВ рдЪрд░реНрдЪрд╛ рдпрд╣реАрдВ рдЫреЛрдбрд╝ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд▓реЛрдЧ рдЕрдкрдиреА рдЬрд░реВрд░рддреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХреЗрдВред рдЗрд╕ рдмреАрдЪ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХреАрдХрд░рдг рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг/рдЕрдиреБрдорд╛рди/рдЪрд░рдгреЛрдВ рдкрд░ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВред

рд╕рдореБрджрд╛рдп рдореЗрдВ рдЕрднреА рдХреБрдЫ рдЪрд░реНрдЪрд╛рдПрдВ рджреЗрдЦреАрдВ

http://apache-spark-developers-list.1001551.n3.nabble.com/Blocked-PySpark-changes-td19712.html

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ PySpark рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдкреАрдЫреЗ рд╣реИ ... рдиреАрдЪреЗ рдХреА рдУрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдореИрдВ рд╡реЛрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ hold on PySpark рдПрдХреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ .....

рд╣рд╛рдБ, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдордирд╛ рдХреА рдЧрдИ рдХрд┐рд╕реА рднреА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдбреАрдмрдЧ рдХрд░рдирд╛ рднреА рдХрдард┐рди рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдЬрдм рдореИрдВ рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рд╕рд╛рд▓ рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рдерд╛) ...

рд░реЛрдбрдореИрдк (#873) рдореЗрдВ, рдЗрд╕рдиреЗ рдХрд╣рд╛ рдХрд┐ рдбрд┐рд╕реНрдЯреНрд░рд┐рдмреНрдпреВрдЯреЗрдб рдкрд╛рдЗрдереЙрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ xgboost рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣рдбреВрдк рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ? (рдореЗрд░рд╛ рдорддрд▓рдм рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдирд╣реАрдВ рд╣реИ)

рд╣рд╛рдБ, рд▓рд┐рдВрдХ рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ

рд╕реНрдХреИрд▓рд╛ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣рдбреВрдк рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓ рд░рд╣реЗ xgboost рдмрдирд╛рдо рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде рд╣рдбреВрдк рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ xgboost рдЪрд▓рд╛рдиреЗ рдХрд╛ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ? рдХреНрдпрд╛ рдкреНрд░рдореБрдЦ рдкреНрд░рджрд░реНрд╢рди рдЕрдВрддрд░ рд╣реИрдВ?
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЙрддреНрдкрд╛рджрди рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП pyspark рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@yiming-chen xgboost4j-spark рдХрд╛ рд▓рдХреНрд╖реНрдп рдПрдХ рд╣реА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ ETL рдФрд░ рдореЙрдбрд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рд╣реИ

рдкреНрд░рд╢реНрди рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИ рдХрд┐ рдИрдЯреАрдПрд▓ рдХрд░рддреЗ рд╕рдордп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ? рдореЗрд░реЗ рдЕрд╡рд▓реЛрдХрди рдФрд░ рдЕрдиреБрднрд╡ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, 95% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рдЕрдкрдирд╛ рдИрдЯреАрдПрд▓ рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ

@CodingCat рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдирд╛ 95% рд╕реНрдЯреЗрдЯ рдХрд╣рд╛рдБ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЕрдиреБрднрд╡ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ PySpark рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдпрд░рдлреНрд▓реЛ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╛рдпрдерди рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред

@berch PySpark рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрдк рдПрдпрд░рдлреНрд▓реЛ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ... рдХреНрдпрд╛ рдпрд╣ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд╣реА рдЧрдИ рдмрд╛рддреЛрдВ рд╕реЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИ?

@CodingCat @tqchen рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рд╕рдореБрджрд╛рдп рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ PySpark рдореЗрдВ XGboost рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐:

  • рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдорд╛рд░реНрдЪ 2017 рддрдХ рдкрд╛рдпрдерди #3 рднрд╛рд╖рд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ 10.2% рд╣реИ (рд╕реНрдХреИрд▓рд╛ рдХреЗ рд▓рд┐рдП 1.8% рдмрдирд╛рдо)
    http://redmonk.com/sogrady/2017/03/17/language-rankings-1-17/
    https://jobsquery.it/stats/language/group;
  • рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рдмрдирд╛рдо рд╕реНрдХреИрд▓рд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рд╣реБрдб рдХреЗ рдиреАрдЪреЗ рдпрд╣ рд▓рдЧрднрдЧ рд╕рднреА рд╕реНрдХреИрд▓рд╛ рд╣реИ, рд╣реИ рдирд╛?
  • рдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо, 3 рдПрдЖрдИ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЬреЛ рдЙрддреНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдкрд╛рдпрд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░, рдЖрдорддреМрд░ рдкрд░, рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдиреМрдХрд░реА рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдорд╛рдВрдЧ рдореЗрдВ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ (
    http://r4stats.com/articles/popularity/)
    рдореЗрд░рд╛ рдирд┐рд╖реНрдХрд░реНрд╖: PySpark рдореЗрдВ рд▓рд╛рдЧреВ XGboost рдХрд╛ рдЕрдиреНрдп рд╕рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХреЗ рдмреАрдЪ DataScience рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдкреНрд░рднрд╛рд╡ рд╣реЛрдЧрд╛ред
    (PS рдПрдХ рдмрд╛рд░ рд╕реНрдерд┐рд░ рд╣реЛрдиреЗ рдкрд░, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, Cloudera рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ)

рдкреАрдЖрд░ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ, рдЖрдкрдХреЛ рд▓рд╛рдЧрдд рдорд┐рд▓ рдЬрд╛рдПрдЧреА

рдмрд╛рд░-рдмрд╛рд░ рдереНрд░реЗрдб рдкрд░ рд╡рд╛рдкрд╕ рдЖрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реВрдВрдЧрд╛ рдХрд┐

  • рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ PySpark рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдЗрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЛрдЯ рдирд╣реАрдВ рджреВрдВрдЧрд╛ (рдЕрднреА рдХреЗ рд▓рд┐рдП)

  • рдЗрд╕ рдкрд░ рдпреЛрдЧрджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

    • рдПрдХ рдФрд░ рдкрд╛рдпрдерди рдкреИрдХреЗрдЬ рдкреЗрд╢ рди рдХрд░реЗрдВ

    • рдПрдХреАрдХрд░рдг рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рд╡рд░реНрддрдорд╛рди рдкрд╛рдпрдерди рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрдбрд╝рд╛ рд╕рдВрдЧрддрддрд╛

    • pyspark рдХреЗ ML . рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдкреАрдЫреЗ рдкрд┐рдЫрдбрд╝рдиреЗ рдХреЛ рд╕рдВрднрд╛рд▓реЗрдВ

рддреЛ рд╣рдо XGBoost-spark рдореЙрдбрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП pyspark рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? @ рдХреЛрдбрд┐рдВрдЧ рдХреИрдЯ

рдЗрд╕рд▓рд┐рдП, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдХреИрд▓рд╛ XGBoost рдХреЛ PySpark JavaEstimator API рдореЗрдВ рдХрдо рджрд░реНрдж рд╕реЗ рд▓рдкреЗрдЯрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдЦреЗрд▓рд╛ рдФрд░ рдРрд╕рд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ:

from pyspark.ml.wrapper import JavaEstimator, JavaModel
from pyspark.ml.param.shared import *
from pyspark.ml.util import *
from pyspark.context import SparkContext

class XGBoost(JavaEstimator, JavaMLWritable, JavaMLReadable, HasRegParam, HasElasticNetParam):

    def __init__(self, paramMap = {}):
        super(XGBoost, self).__init__()
        scalaMap = SparkContext._active_spark_context._jvm.PythonUtils.toScalaMap(paramMap)
        self._java_obj = self._new_java_obj(
            "ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
        self._defaultParamMap = paramMap
        self._paramMap = paramMap

    def setParams(self, paramMap = {}):
        return self._set(paramMap)

    def _create_model(self, javaTrainingData):
        return JavaModel(javaTrainingData)

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрднреА рднреА рдХреБрдЫ рдХрд╛рдо рдХреА рдЬрд░реВрд░рдд рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХреЗ рд╕рд╛рде PySpark рдореЗрдВ Xgboost рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред

Wieslaw XGBoost PySpark рд░реИрдкрд░ рдкрд░ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рдЙрдЪрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде XGBoost рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж

@wpopielarski рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рд╣реИ рдЬреЛ рдЖрдкрдиреЗ рдХрд┐рдпрд╛ред рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде XGBoost рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдпрд╣ рдПрдХ рдмрдбрд╝реА рдорджрдж рд╣реЛрдЧреА!

рдпрд╣ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

        from app.xgboost import XGBoost
        xgboost_params = {
            "eta"  : 0.023,
            "max_depth" : 10,
            "min_child_weight" : 0.3,
            "subsample" : 0.7,
            "colsample_bytree" : 0.82,
            "colsample_bylevel" : 0.9,
            "base_score" : base_score,
            "eval_metric" : "auc",
            "seed" : 49,
            "silent" : 1,
            "objective" : "binary:logistic",
            "round" : 10,
            "nWorkers" : 2,
            "useExternalMemory" : True
        }
        xgboost_estimator = XGBoost.XGBoost(xgboost_params)
...
        model = xgboost_estimator.fit(data)

рдореИрдВ рдЙрдЪрд┐рдд рдкрд╛рдпрд╕реНрдкрд╛рд░реНрдХ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдкреАрдЖрд░ рдХрд░рдиреЗ рдХреЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реВрдВред

@thesuperzapper , рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!

рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рдХрд┐рддрдирд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛? рдкреНрд░рдЧрддрд┐ рдХрд░рддреЗ рд╕рдордп рдЕрдВрддрд░реНрджреГрд╖реНрдЯрд┐ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

рдзрдиреНрдпрд╡рд╛рдж!

рдирдорд╕реНрддреЗ, рдореИрдВ ParamGridBuilder рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдпрджрд┐ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реИред

  • 1 рдХрд┐рд╕реА рднреА рдорд╛рдиреНрдп PYTHONPATH dir рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЬ dir mkdir -p ml/dmlc/xgboost4j/scala рдмрдирд╛рдПрдВред
  • 2 рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ ml/dmlc/xgboost4j/scala/spark.py рдХреЙрдкреА рдХрд░реЗрдВ
from pyspark.ml.classification import JavaClassificationModel, JavaMLWritable, JavaMLReadable, TypeConverters, Param, \
    Params, HasFeaturesCol, HasLabelCol, HasPredictionCol, HasRawPredictionCol, SparkContext
from pyspark.ml.wrapper import JavaModel, JavaWrapper, JavaEstimator


class XGBParams(Params):
    '''

    '''
    eta = Param(Params._dummy(), "eta",
                "step size shrinkage used in update to prevents overfitting. After each boosting step, we can directly get the weights of new features. and eta actually shrinks the feature weights to make the boosting process more conservative",
                typeConverter=TypeConverters.toFloat)
    max_depth = Param(Params._dummy(), "max_depth",
                      "maximum depth of a tree, increase this value will make the model more complex / likely to be overfitting. 0 indicates no limit, limit is required for depth-wise grow policy.range: [0,тИЮ]",
                      typeConverter=TypeConverters.toInt)
    min_child_weight = Param(Params._dummy(), "min_child_weight",
                             "minimum sum of instance weight (hessian) needed in a child. If the tree partition step results in a leaf node with the sum of instance weight less than min_child_weight, then the building process will give up further partitioning. In linear regression mode, this simply corresponds to minimum number of instances needed to be in each node. The larger, the more conservative the algorithm will berange: [0,тИЮ]",
                             typeConverter=TypeConverters.toFloat)
    max_delta_step = Param(Params._dummy(), "max_delta_step",
                           "Maximum delta step we allow each treeтАЩs weight estimation to be. If the value is set to 0, it means there is no constraint. If it is set to a positive value, it can help making the update step more conservative. Usually this parameter is not needed, but it might help in logistic regression when class is extremely imbalanced. Set it to value of 1-10 might help control the update.",
                           typeConverter=TypeConverters.toInt)
    subsample = Param(Params._dummy(), "subsample",
                      "subsample ratio of the training instance. Setting it to 0.5 means that XGBoost randomly collected half of the data instances to grow trees and this will prevent overfitting.",
                      typeConverter=TypeConverters.toFloat)
    colsample_bytree = Param(Params._dummy(), "colsample_bytree",
                             "subsample ratio of columns when constructing each tree",
                             typeConverter=TypeConverters.toFloat)
    colsample_bylevel = Param(Params._dummy(), "colsample_bylevel",
                              "subsample ratio of columns for each split, in each level.",
                              typeConverter=TypeConverters.toFloat)
    max_leaves = Param(Params._dummy(), "max_leaves",
                       "Maximum number of nodes to be added. Only relevant for the тАШlossguideтАЩ grow policy.",
                       typeConverter=TypeConverters.toInt)

    def __init__(self):
        super(XGBParams, self).__init__()

class XGBoostClassifier(JavaEstimator, JavaMLWritable, JavaMLReadable, XGBParams,
                        HasFeaturesCol, HasLabelCol, HasPredictionCol, HasRawPredictionCol):
    def __init__(self, paramMap={}):
        super(XGBoostClassifier, self).__init__()
        scalaMap = SparkContext._active_spark_context._jvm.PythonUtils.toScalaMap(paramMap)
        self._java_obj = self._new_java_obj("ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
        self._defaultParamMap = paramMap
        self._paramMap = paramMap

    def setParams(self, paramMap={}):
        return self._set(paramMap)

    def _create_model(self, java_model):
        return XGBoostClassificationModel(java_model)


class XGBoostClassificationModel(JavaModel, JavaClassificationModel, JavaMLWritable, JavaMLReadable):

    def getBooster(self):
        return self._call_java("booster")

    def saveBooster(self, save_path):
        jxgb = JavaWrapper(self.getBooster())
        jxgb._call_java("saveModel", save_path)
  • 3 рдЗрд╕реЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп pyspark рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЗрд▓реЗрдВ!

@AakashBasuRZT @haiy , рдЕрдм рд╣рдо рдЕрдВрдХ #3370 рдореЗрдВ рдЗрд╕ рдкрд░ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдкреАрдЖрд░ #3376 рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд░рд╣рд╛ рд╣реИред

@haiy рдХреНрдпрд╛ рдЖрдк рдореБрдЭреЗ рдХреЛрдб рдХрд╛ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХреБрдЫ рдЖрд░реНрдмрд┐рдЯрд░реА рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдХреНрд▓рд╛рд╕рд┐рдлрд╛рдпрд░рд┐рдпрд░ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ? рдореИрдВрдиреЗ рдмрд┐рдВрджреБ 1 рдФрд░ 2 рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХрд╛ рддреАрд╕рд░рд╛ рдмрд┐рдВрджреБ рдирд╣реАрдВ рд╕рдордЭ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред

@sagnik-rzt рдЗрд╕ рдирдореВрдиреЗ рдХреА рдЬрд╛рдБрдЪ

@haiy рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:

import pyspark
import pandas as pd
from dmlc.xgboost4j.scala.spark import XGBoostClassifier
from sklearn.utils import shuffle

sc = pyspark.SparkContext('local[2]')
spark = pyspark.sql.SparkSession(sc)
df = pd.DataFrame({'x1': range(10), 'x2': [10] * 10, 'y': shuffle([0 for i in range(5)] + [1 for i in range(5)])})
sdf = spark.createDataFrame(df)
X = sdf.select(['x1', 'x2'])
Y = sdf.select(['y'])
print(X.show(5))

params = {'objective' :'binary:logistic', 'n_estimators' : 10, 'max_depth' : 3, 'learning_rate' : 0.033}
xgb_model = XGBoostClassifier(params)

рдФрд░ рдпрд╣ рдпрд╣ рдЕрдкрд╡рд╛рдж рджреЗ рд░рд╣рд╛ рд╣реИ:

Traceback (most recent call last):
  File "/home/sagnikb/PycharmProjects/auto_ML/pyspark_xgboost.py", line 20, in <module>
    xgb_model = XGBoostClassifier(params)
  File "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", line 47, in __init__
    self._java_obj = self._new_java_obj("ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable

Error in sys.excepthook:
Traceback (most recent call last):
  File "/home/sagnikb/PycharmProjects/auto_ML/pyspark_xgboost.py", line 20, in <module>
    xgb_model = XGBoostClassifier(params)
  File "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", line 47, in __init__
    self._java_obj = self._new_java_obj("ml.dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable
Exception ignored in: <bound method JavaParams.__del__ of XGBoostClassifier_4f9eb5d1388e9e1424a4>
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 105, in __del__
    SparkContext._active_spark_context._gateway.detach(self._java_obj)
  File "/usr/local/lib/python3.6/dist-packages/py4j/java_gateway.py", line 1897, in detach
    java_object._detach()
AttributeError: 'NoneType' object has no attribute '_detach'

рдкрд░реНрдпрд╛рд╡рд░рдг:
рдкрд╛рдпрдерди 3.6
рд╕реНрдкрд╛рд░реНрдХ 2.3
рд╕реНрдХрд╛рд▓рд╛ 2.11

@sagnik-rzt
рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рд╕реНрдкрд╛рд░реНрдХ рдХреНрд▓рд╛рд╕рдкрд╛рде рдкрд░ рдбреАрдкреАрдПрд╕ рдХреЗ рд╕рд╛рде xgboost-spark.jar рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ?

@wpopielarski рдЕрд░реЗ рдирд╣реАрдВ рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдЬрд╣рд╛рдВ рдореБрдЭреЗ рд╡рд╣ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ?

@ sagnik-rzt рд╣рд╛рдп, рдХреГрдкрдпрд╛ рдпрд╣рд╛рдБ рдЬрд╛рд░ рдбрд╛рдЙрдирд▓реЛрдб . рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдЕрднреА рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдореЗрд░рд╛ рдЬрд╛рд░ рдореИрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд╕ рдЗрд╕реЗ @wpopielarski рд╕реБрдЭрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдФрд░ рдЗрд╕реЗ рд╕реНрдкрд╛рд░реНрдХ рдбрд┐рдкреНрд╕ рдбреАрдЖрдИрдЖрд░ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВ, рдЬреИрд╕реЗ $SPARK_HOME/jars ред

рдЗрд╕реЗ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ :), рдореЗрд╡реЗрди рдФрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓ assembly рдЬреЛ jvm-packages/xgboost-spark/target рдпрд╛ рддреЛ рдореЗрдВ рд╡рд╕рд╛ рдЬрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИред

@ sagnik-rzt рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ OS рдХреЗ рд▓рд┐рдП рдлреИрдЯ рдЬрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ dmlc xgboost github рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ, cd рд╕реЗ jvm-packages рдФрд░ assemby рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде mvn рдЪрд▓рд╛рдПрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЧреНрд░реЗрдбреЗрд▓ рдмрд┐рд▓реНрдб рдлрд╝рд╛рдЗрд▓ рдХреИрд╕реЗ рд▓рд┐рдЦрдиреА рд╣реИред

рдареАрдХ рд╣реИ рддреЛ рдореИрдВрдиреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдЯрд╛ рдЬрд╛рд░ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ $SPARK_HOME/jars рдкрд░ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣реА рдЕрдкрд╡рд╛рдж рдЕрднреА рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ:

Traceback (most recent call last):
  File "/home/sagnikb/PycharmProjects/xgboost/test_import.py", line 21, in <module>
    clf = xgb(params)
  File "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", line 48, in __init__
    self._java_obj = self._new_java_obj("dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
  File "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", line 63, in _new_java_obj
    return java_obj(*java_args)
TypeError: 'JavaPackage' object is not callable

рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдХреБрдЫ рдЖрдИрдбреАрдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓рд╛рддреЗ рд╣реИрдВ? рдпрджрд┐ рдЖрдк рд╣реИрдВ
рд╕реНрдкрд╛рд░реНрдХ-рд╕рдмрдорд┐рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ - рдЬрд╛рд░ рд╕реНрд╡рд┐рдЪ рдореЗрдВ рдбрд┐рдкреНрд╕ рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ

2018/06/29 14:30 GMT + 02: 00 sagnik-rzt [email protected] :

рдареАрдХ рд╣реИ рддреЛ рдореИрдВрдиреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдЯрд╛ рдЬрд╛рд░ рдмрдирд╛рдпрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ
$SPARK_HOME/рдЬрд╛рд░ рддрдХред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡рд╣реА рдЕрдкрд╡рд╛рдж рдЕрднреА рднреА рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ:

рдЯреНрд░реЗрд╕рдмреИрдХ (рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдХреЙрд▓ рдЕрдВрддрд┐рдо):
рдлрд╝рд╛рдЗрд▓ "/home/sagnikb/PycharmProjects/xgboost/test_import.py", рдкрдВрдХреНрддрд┐ 21, рдореЗрдВ
рд╕реАрдПрд▓рдПрдл = рдПрдХреНрд╕рдЬреАрдмреА (рдкреИрд░рд╛рдореНрд╕)
рдлрд╝рд╛рдЗрд▓ "/usr/lib/ml/dmlc/xgboost4j/scala/spark.py", рд▓рд╛рдЗрди 48, __init__ рдореЗрдВ
self._java_obj = self._new_java_obj("dmlc.xgboost4j.scala.spark.XGBoostEstimator", self.uid, scalaMap)
рдлрд╝рд╛рдЗрд▓ "/usr/local/lib/python3.6/dist-packages/pyspark/ml/wrapper.py", рд▓рд╛рдЗрди 63, _new_java_obj рдореЗрдВ
рд╡рд╛рдкрд╕реА java_obj(*java_args)
рд▓реЗрдЦрди рддреНрд░реБрдЯрд┐: 'JavaPackage' рд╡рд╕реНрддреБ рдкреНрд░рддрд┐рджреЗрдп рдирд╣реАрдВ рд╣реИ

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dmlc/xgboost/issues/1698#issuecomment-401339910 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/ALEzS3JmKjO0AZ6JMzcixwCce0_3zRM0ks5uBh3ogaJpZM4KgAY_
.

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ #3376 рдХреЛ рдирдИ рд╕реНрдкрд╛рд░реНрдХ рд╢рд╛рдЦрд╛ рдореЗрдВ рд░реАрдмреЗрд╕ рдХрд░рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рдмреАрдЪ, рдХреБрдЫ рд▓реЛрдЧреЛрдВ рдиреЗ XGBoost-0.72 рдкрд░ рд╡рд░реНрддрдорд╛рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рд╣реИред

рдпрд╣рд╛рдБ XGBoost-0.72 рдХреЗ рд▓рд┐рдП pyspark рдХреЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╝рд┐рдк рдлрд╝рд╛рдЗрд▓ рд╣реИред
рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ: Sparkxgb.zip

рдЖрдкрдХреЛ рдмрд╕ рдЗрддрдирд╛ рдХрд░рдирд╛ рд╣реИ:

  1. рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдХрд╛рд▓рд╛ XGBoost рдЬрд╛рд░ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВред (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП --jars рдпрд╛ spark.jars рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛)ред
  2. рдПрдХ рдмрд╛рд░ рдХрд╛рдо рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдЪрд▓рд╛рдПрдВ: (рдпрд╛ рдХреЛрдИ рднреА рд╕реНрдерд╛рдиреАрдп рд╕реНрдерд╛рди рдЬрд┐рд╕реЗ рд╣рд░ рдирд┐рд╖реНрдкрд╛рджрдХ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ)
sc.addPyFile("hdfs:///XXXX/XXXX/XXXX/sparkxgb.zip")
  1. рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред (рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдЖрдк sample_binary_classification_data.txt рдХреЛ рдПрдХ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЧрдП рд╣реИрдВ, рдпрд╣ рдЖрдорддреМрд░ рдкрд░ $SPARK_HOME/data/mllib/sample_binary_classification_data.txt )
from sparkxgb import XGBoostEstimator

# Load Data
dataPath = "sample_binary_classification_data.txt"
dataDF = spark.read.format("libsvm").load(dataPath)

# Split into Train/Test
trainDF, testDF = dataDF.randomSplit([0.8, 0.2], seed=1000)

# Define and train model
xgboost = XGBoostEstimator(
    # General Params
    nworkers=1, nthread=1, checkpointInterval=-1, checkpoint_path="",
    use_external_memory=False, silent=0, missing=float("nan"),

    # Column Params
    featuresCol="features", labelCol="label", predictionCol="prediction", 
    weightCol="weight", baseMarginCol="baseMargin", 

    # Booster Params
    booster="gbtree", base_score=0.5, objective="binary:logistic", eval_metric="error", 
    num_class=2, num_round=2, seed=None,

    # Tree Booster Params
    eta=0.3, gamma=0.0, max_depth=6, min_child_weight=1.0, max_delta_step=0.0, subsample=1.0,
    colsample_bytree=1.0, colsample_bylevel=1.0, reg_lambda=0.0, alpha=0.0, tree_method="auto",
    sketch_eps=0.03, scale_pos_weight=1.0, grow_policy='depthwise', max_bin=256,

    # Dart Booster Params
    sample_type="uniform", normalize_type="tree", rate_drop=0.0, skip_drop=0.0,

    # Linear Booster Params
    lambda_bias=0.0
)
xgboost_model = xgboost.fit(trainDF)

# Transform test set
xgboost_model.transform(testDF).show()

# Write model/classifier
xgboost.write().overwrite().save("xgboost_class_test")
xgboost_model.write().overwrite().save("xgboost_class_test.model")

рдзреНрдпрд╛рди рджреЗрдВ:

  • рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдкрд╛рд░реНрдХ 2.2+ . рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛
  • рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдФрд░ ParamGridBuilder рд╕рдорд░реНрдерд┐рдд рд╣реИрдВ, рд╕рдВрд╢реЛрдзрд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ from sparkxgb.pipeline import XGBoostPipeline,XGBoostPipelineModel рд╕рд╛рде рдХрд░реЗрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗред
  • XGboost-0.72 рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЗ рдХрд╛рд░рдг рдЕрд╢рдХреНрдд рдорд╛рдиреЛрдВ рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрд▓рд╛рдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдлреНрд▓реЛрдЯ ("рдиреИрди") рдХреЗ рдмрдЬрд╛рдп рд▓рд╛рдкрддрд╛ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдлреНрд▓реЛрдЯ ("+ inf") рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  • рдЖрдк рдЕрдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд╛рдкрд╕ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, (#3035 рджреЗрдЦреЗрдВ)
  • рдпрд╣ рдПрдкреАрдЖрдИ pyspark рд╕рдорд░реНрдерди рдХреЗ рдкреВрд░реНрдг рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

@thesuperzapper рдореИрдВ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдкрд░ pyspark рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо:
рдЕрдЬрдЧрд░ 3.6.1
xgboost 0.72
рдЪрд┐рдВрдЧрд╛рд░реА 2.2.0
рдЬрд╛рд╡рд╛ 1.8
рд╕реНрдХреИрд▓рд╛ 2.12

рдЬрдм рдореИрдВ XGBoostEstimator рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдорд┐рд▓рддрд╛ рд╣реИ:

Exception in thread "Thread-19" java.lang.NoClassDefFoundError: ml/dmlc/xgboost4j/scala/EvalTrait
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetPublicMethods(Class.java:2902)
    at java.lang.Class.getMethods(Class.java:1615)
    at py4j.reflection.ReflectionEngine.getMethodsByNameAndLength(ReflectionEngine.java:345)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:305)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
    at py4j.Gateway.invoke(Gateway.java:272)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:214)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.ClassNotFoundException: ml.dmlc.xgboost4j.scala.EvalTrait
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 12 more

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдмрдЧ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИрдВ?

@BogdanCojocar рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА xgboost рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЧреБрдо рд╣реИред

xgboost рдХреЗ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрди рджреЛрдиреЛрдВ рдЬрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдЖрдк рдЙрди рдореЗрд╡реЗрди рд▓рд┐рдВрдХ рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдзрдиреНрдпрд╡рд╛рдж @thesuperzapperред рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред pyspark рдХреЗ рд╕рд╛рде рдЗрд╕ рдПрдХреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо!

рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдореЙрдбрд▓ рдХреЛ рдмреВрд╕реНрдЯрд░ рдореЗрдВ рдХреИрд╕реЗ рд╕рд╣реЗрдЬрдирд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕реБрдЭрд╛рд╡?

@ ericwang915 рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдореЙрдбрд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрдиреНрдп XGBoost рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░-рдСрдкрд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдореЙрдбрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ .booster.saveModel("XXX/XXX") рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ XXX рд╕реНрдкрд╛рд░реНрдХ рдбреНрд░рд╛рдЗрд╡рд░ рдкрд░ рдПрдХ рд╕реНрдерд╛рдиреАрдп (рдЧреИрд░ рдПрдЪрдбреАрдПрдлрдПрд╕) рдкрде рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рдмрдЪрдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдкрдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ (рджреЗрдЦреЗрдВ: #2480)

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рд░реИрдкрд░ рдХреЗ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕реЗрд╡ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдирд╛ рднреВрд▓ рдЧрдпрд╛, рдЕрдЧрд░ рдореБрдЭреЗ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИ рддреЛ рдореИрдВ рдЗрд╕реЗ рдХрд▓ рдХрд░реВрдБрдЧрд╛ред (рдореИрдВ рдиреНрдпреВрдЬреАрд▓реИрдВрдб рдореЗрдВ рд░рд╣рддрд╛ рд╣реВрдВ ... рдЗрд╕рд▓рд┐рдП рд╕рдордп рдХреНрд╖реЗрддреНрд░)

рд╢реБрдХреНрд░рд┐рдпрд╛ред рд╡реИрд╕реЗ, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдореВрд▓реНрдпрд╛рдВрдХрди рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рдмреВрд╕реНрдЯрд┐рдВрдЧ рд░рд╛рдЙрдВрдб рджрд┐рдЦрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИ, рднрд▓реЗ рд╣реА рд╕рд╛рдЗрд▓реЗрдВрдЯ 1 рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рд╣реЛред

@thesuperzapper рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ pyspark рдореЗрдВ xgboost рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд/рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдЖрдкрдХреЗ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдЕрдиреНрдп xgboost рдореЙрдбрд▓ рдлрд╝рдВрдХреНрд╢рди рдЬреИрд╕реЗ (рд╕реНрдХреИрд▓рд╛) getFeatureScore () рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░?

@ccdtzccdtz рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдореИрдВ pyspark рд░реИрдкрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╢реБрд░реБрдЖрддреА рдкрд╛рдЗрд╕реНрдкрд╛рд░реНрдХ рд░реИрдкрд░ рдореЗрдВ рджреЗрд╢реА рдмреВрд╕реНрдЯрд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╕реНрдкрд╛рд░реНрдХ рд╕реНрдХрд╛рд▓рд╛ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк xgboost_model_object.nativeBooster.getFeatureScore( рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХреА рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВрдиреЗ XGBoost рдХреЛ pyspark рдкрд░ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рджреЗрдЦрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕реЗ 2 рдпрд╛ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдЙрд╕реА рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрд╕реА рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВред рдкрд╣рд▓реА рдмрд╛рд░ рдпрд╣ рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдмрд╛рд░ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рд╕реНрдкрд╛рд░реНрдХ 2.3.3 рдкрд░ XGBoost 0.72 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рд░реНрдп рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП pyspark рд╢реЗрд▓ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдореИрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП xgboost.trainWithDataFrame рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рджреЗрдЦрд╛ рд╣реИ?

рд╣рд╛рдп @thesuperzapper
рдЖрдкрдиреЗ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХрд▓ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдб рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдореИрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ 3) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pyspark xgboost рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдЯрд╛рдЗрдЯреИрдирд┐рдХ рдбреЗрдЯрд╛рд╕реЗрдЯ (рдЬреЛ рдПрдХ рдЫреЛрдЯрд╛ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╣реИ) рдкрд░ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

from pyspark.sql.session import SparkSession
from pyspark.sql.types import *
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml import Pipeline
from pyspark.sql.functions import col

spark = SparkSession\
        .builder\
        .appName("PySpark XGBOOST Titanic")\
        .getOrCreate()

#spark.sparkContext.addPyFile("../sparkxgb.zip")

from automl.sparkxgb import XGBoostEstimator

schema = StructType(
  [StructField("PassengerId", DoubleType()),
    StructField("Survival", DoubleType()),
    StructField("Pclass", DoubleType()),
    StructField("Name", StringType()),
    StructField("Sex", StringType()),
    StructField("Age", DoubleType()),
    StructField("SibSp", DoubleType()),
    StructField("Parch", DoubleType()),
    StructField("Ticket", StringType()),
    StructField("Fare", DoubleType()),
    StructField("Cabin", StringType()),
    StructField("Embarked", StringType())
  ])

df_raw = spark\
  .read\
  .option("header", "true")\
  .schema(schema)\
  .csv("titanic.csv")


df = df_raw.na.fill(0)

sexIndexer = StringIndexer() \
    .setInputCol("Sex") \
    .setOutputCol("SexIndex") \
    .setHandleInvalid("keep")

cabinIndexer = StringIndexer() \
    .setInputCol("Cabin") \
    .setOutputCol("CabinIndex") \
    .setHandleInvalid("keep")

embarkedIndexer = StringIndexer() \
    .setInputCol("Embarked") \
    .setOutputCol("EmbarkedIndex") \
    .setHandleInvalid("keep")

vectorAssembler  = VectorAssembler()\
  .setInputCols(["Pclass", "SexIndex", "Age", "SibSp", "Parch", "Fare", "CabinIndex", "EmbarkedIndex"])\
  .setOutputCol("features")

xgboost = XGBoostEstimator(nworkers=2,
    featuresCol="features",
    labelCol="Survival",
    predictionCol="prediction"
)

pipeline = Pipeline().setStages([sexIndexer, cabinIndexer, embarkedIndexer, vectorAssembler, xgboost])
trainDF, testDF = df.randomSplit([0.8, 0.2], seed=24)

model  =pipeline.fit(trainDF)
print(trainDF.schema)

рдпрд╣ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╣реИ:
Tracker started, with env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=172.16.1.5, DMLC_TRACKER_PORT=9093, DMLC_NUM_WORKER=3}2018-09-04 08:52:55 ERROR TaskSchedulerImpl:70 - Lost executor 0 on 192.168.49.43: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages.2018-09-04 08:52:55 ERROR AsyncEventQueue:91 - Interrupted while posting to TaskFailedListener. Removing that listener.java.lang.InterruptedException: ExecutorLost during XGBoost Training: ExecutorLostFailure (executor 0 exited caused by one of the running tasks) Reason: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages. at org.apache.spark.TaskFailedListener.onTaskEnd(SparkParallelismTracker.scala:116) at org.apache.spark.scheduler.SparkListenerBus$class.doPostEvent(SparkListenerBus.scala:45) at org.apache.spark.scheduler.AsyncEventQueue.doPostEvent(AsyncEventQueue.scala:37) at org.apache.spark.scheduler.AsyncEventQueue.doPostEvent(AsyncEventQueue.scala:37) at org.apache.spark.util.ListenerBus$class.postToAll(ListenerBus.scala:91)

рдирд┐рд╖реНрдкрд╛рджрдХ рдЗрд╕ рдкрд░ рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реИ:
org.apache.spark.RDD.foreachPartition(RDD.scala:927) ml.dmlc.xgboost4j.scala.spark.XGBoost$$anonfun$trainDistributed$4$$anon$1.run(XGBoost.scala:348)

рдкрд░реНрдпрд╛рд╡рд░рдг: рдкрд╛рдпрдерди 3.5.4, рд╕реНрдкрд╛рд░реНрдХ рд╕рдВрд╕реНрдХрд░рдг 2.3.1, Xgboost 0.72

рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ xgboost рдФрд░ рд╕реНрдкрд╛рд░реНрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдХрд┐рддрдиреЗ
рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ (xgboost рдХрд╛рд░реНрдпрдХрд░реНрддрд╛), рд╕реНрдкрд╛рд░реНрдХ рдирд┐рд╖реНрдкрд╛рджрдХ, рдХреЛрд░ рдЖрджрд┐ред

-рдирд┐рддрд┐рди

5:03 рдкреВрд░реНрд╡рд╛рд╣реНрди рдкрд░ рдордВрдЧрд▓ рд╕рд┐рддрдореНрдмрд░ 4, 2018 рдкрд░ sagnik-rzt [email protected] рд▓рд┐рдЦрд╛ рд╣реИ:

рд╣рд╛рдп @thesuperzapper https://github.com/thesuperzapper
рдЖрдкрдиреЗ рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХрд▓ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдиреЛрдб рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдореИрдВ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ pyspark xgboost рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдБ
рдХрд╛рд░реНрдпрдХрд░реНрддрд╛, рдирд┐рд╖реНрдкрд╛рджрдХ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
рдпрд╣ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╣реИ:
'''
рдЯреНрд░реИрдХрд░ рд╢реБрд░реВ рд╣реБрдЖ, env={DMLC_NUM_SERVER=0, DMLC_TRACKER_URI=172.16.1.5 рдХреЗ рд╕рд╛рде,
DMLC_TRACKER_PORT=9093, DMLC_NUM_WORKER=3}2018-09-04 08:52:55 рддреНрд░реБрдЯрд┐
рдЯрд╛рд╕реНрдХрд╢реЗ рдбреНрдпреВрд▓рд░рдЗрдореНрдкреНрд▓:70 - 192.168.49.43 рдкрд░ рдирд┐рд╖реНрдкрд╛рджрдХ 0 рдЦреЛ рдЧрдпрд╛: рд░рд┐рдореЛрдЯ рдЖрд░рдкреАрд╕реА
рдЧреНрд░рд╛рд╣рдХ рдЬреБрджрд╛ред рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдХрд╛рд░рдг, рдпрд╛
рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдореБрджреНрджреЗред рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ рд▓реЙрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред2018-09-04 08:52:55
рддреНрд░реБрдЯрд┐ AsyncE ventQueue:91 - рдЯрд╛рд╕реНрдХрдлреЗрд▓
рдЙрд╕ рд╢реНрд░реЛрддрд╛ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИред java.lang.InterruptedException: ExecutorLost рджреМрд░рд╛рди
XGBoost рдЯреНрд░реЗрдирд┐рдВрдЧ: рдПрдХреНрдЬрд╝реАрдХреНрдпреВрдЯрд░рд▓реЙрд╕реНрдЯ рдлрд╝реЗрд▓реНрдпреЛрд░ (рдирд┐рд╖реНрдкрд╛рджрдХ 0 рдЗрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рдХрд╛рд░рдг рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЧрдпрд╛)
рдЪрд▓ рд░рд╣реЗ рдХрд╛рд░реНрдп) рдХрд╛рд░рдг: рджреВрд░рд╕реНрде RPC рдХреНрд▓рд╛рдЗрдВрдЯ рдЕрд╕рдВрдмрджреНрдзред рд╕рдВрднрд╡рддрдГ рдХреЗ рдХрд╛рд░рдг
рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рдХрдВрдЯреЗрдирд░, рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдорд╕реНрдпрд╛рдПрдБред рдХреЗ рд▓рд┐рдП рдбреНрд░рд╛рдЗрд╡рд░ рд▓реЙрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
рдЪреЗрддрд╛рд╡рдиреА рд╕рдВрджреЗрд╢ред рдкрд░
org.apache.spark.TaskFailedListener.onTaskEnd(SparkParallelismTracker.scala:116)
рдкрд░
org.apache.spark.scheduler.SparkListenerBus$class.doPostEvent(SparkListenerBus.scala:45)
рдкрд░
org.apache.spark.scheduler.AsyncEventQueue.doPostEvent(AsyncEventQueue.scala:37)
рдкрд░
org.apache.spark.scheduler.AsyncEventQueue.doPostEvent(AsyncEventQueue.scala:37)
org.apache.spark.util.ListenerBus$class.postToAll(ListenerBus.scala:91) рдкрд░
'''

-
рдЖрдк рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдиреЗ рдЯрд┐рдкреНрдкрдгреА рдХреА рдереАред
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рд╕реАрдзреЗ рдЙрддреНрддрд░ рджреЗрдВ, рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВ
https://github.com/dmlc/xgboost/issues/1698#issuecomment-418341557 , рдпрд╛ рдореНрдпреВрдЯ рдХрд░реЗрдВ
рд╕реВрддреНрд░
https://github.com/notifications/unsubscribe-auth/AJY-XklxsZB_FE7ZoAarV_fqw8D3JqxWks5uXmwqgaJpZM4KgAY_
.

@ sagnik-rzt рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ pyspark рд░реИрдкрд░ рдХреЗрд╡рд▓ XGboost 0.72 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЕрднреА рднреА 0.8 рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@thesuperzapper , рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ xgboost 0.80 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ py4j.protocol.Py4JError: ml.dmlc.xgboost4j.scala.spark.XGBoostClassifier does not exist in the JVM рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдПрдХ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ ред рдХреНрдпрд╛ рдЖрдк рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ?

рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдВ рд░рдЦреЗ рдЧрдП рд╣реИрдВ ред

рдЗрд╕реЗ 0.8 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдЕрдзрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореБрдЦреНрдп рдХрд╛рд░рдг рдореИрдВрдиреЗ рдЕрднреА 0.8 рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдзрдХреНрдХрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ xgboost рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдЬреИрд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ 0.72 рдореЗрдВ рд╣реИ, рдореИрдВ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ pyspark xgboost рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рджреГрдврд╝рддрд╛ рдХреЗ рд╕рд╛рдеред

@thesuperzapper , 0.72 рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рд╕реАрдзреЗ XGBoostEstimator рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬреЛ рдХрд┐ XGBoostPipeline рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рд╣реИред рдФрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг/рдлрд┐рдЯрд┐рдВрдЧ рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рд╕рднреА рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХреНрдпрд╛ рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП XGBoostPipeline рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?

рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

рдЕрджреНрдпрддрди
рдореИрдВ рд╕реНрдерд╛рдкрдирд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХреА XGBoostEstimator рдореЗрдВ рдПрдХ рдордВрдЪ рдХреЗ рд░реВрдк рдореЗрдВ XGBoostPipeline рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИред рдЬрдм рдореИрдВ рдЗрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рддреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╢реНрд░рдорд┐рдХреЛрдВ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрдмрдХрд┐ рдпрд╣ рдЕрдиреНрдп pyspark рд╕рдорд░реНрдерд┐рдд рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЗрдЦрд╛ рд╣реИ? рдореИрдВ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреВрдВ?

рдореИрдВрдиреЗ рдЬреНрдпрд╛рджрд╛рддрд░ XGBoost 0.8 рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреЛрдбрд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░рд╛ рдХрд╛рд░реНрдп рдХреНрд▓рд╕реНрдЯрд░ рдЕрднреА рднреА 2.2 рдкрд░ рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдореЛрдб рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ Dockerized Spark 2.3 рдХреНрд▓рд╕реНрдЯрд░ рд╕реНрдХреИрд▓рд╛ XGBoost рд╡рд┐рддрд░рд┐рдд рдореЙрдбрд▓ рдХреЛ рдмрд┐рдирд╛ рдлреЗрд░рдмрджрд▓ рд╕реНрдерд╛рди рдХреЗ рд▓рд╛рдкрддрд╛ рдореБрджреНрджреЛрдВ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред .

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @ sagnik-rzt рдФрд░ рдЕрдиреНрдп рдЬрд┐рди рдореБрджреНрджреЛрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдпрд╛ рд╕реНрдкрд╛рд░реНрдХ-рд╕реНрдХрд╛рд▓рд╛ XGBoost рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрд╣рд░реА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

рдХреНрдпрд╛ рдЖрдк рдХрд┐рд╕реА рдореЙрдбрд▓ рдХреЛ Spark-Scala XGBoost рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рдзрдиреНрдпрд╡рд╛рдж @thesuperzapper , рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдлреЗрд░рдмрджрд▓ рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рдд, рдЗрд╕реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдзреНрдпрд╛рди рд░рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдкреЛрд╕реНрдЯ рдорд┐рд▓рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрди рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕рд╛рде рд╣реА, рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ 0.8 рд╕рдВрд╕реНрдХрд░рдг рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ рддреИрдпрд╛рд░ рд╣реИ? рдореИрдВ рдЕрдкрдиреЗ рдХреНрд▓рд╕реНрдЯрд░ рдкрд░ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рдЗрд╕рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХ 2.3.1 рдФрд░ рдкрд╛рдпрдерди 3.5 рд╣реИред

рдореЙрдбрд▓ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рд╣реЛ рд░рд╣реА рд╣реИ

IllegalArgumentException: u'requirement рд╡рд┐рдлрд▓: рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рддреНрд░реБрдЯрд┐: рдЕрдкреЗрдХреНрд╖рд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо org.apache.spark.ml.Pipeline рд▓реЗрдХрд┐рди рдкрд╛рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо org.apache.spark.ml.PipelineModel'

рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдзрдиреНрдпрд╡рд╛рдж

import pyspark
from pyspark.sql.session import SparkSession
from pyspark.sql.types import *
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml import Pipeline
from pyspark.sql.functions import col

spark.sparkContext.addPyFile("sparkxgb.zip")
from sparkxgb import XGBoostEstimator
schema = StructType(
  [StructField("PassengerId", DoubleType()),
    StructField("Survival", DoubleType()),
    StructField("Pclass", DoubleType()),
    StructField("Name", StringType()),
    StructField("Sex", StringType()),
    StructField("Age", DoubleType()),
    StructField("SibSp", DoubleType()),
    StructField("Parch", DoubleType()),
    StructField("Ticket", StringType()),
    StructField("Fare", DoubleType()),
    StructField("Cabin", StringType()),
    StructField("Embarked", StringType())
  ])

df_raw = spark\
  .read\
  .option("header", "true")\
  .schema(schema)\
  .csv("train.csv")

 df = df_raw.na.fill(0)

 sexIndexer = StringIndexer()\
  .setInputCol("Sex")\
  .setOutputCol("SexIndex")\
  .setHandleInvalid("keep")

cabinIndexer = StringIndexer()\
  .setInputCol("Cabin")\
  .setOutputCol("CabinIndex")\
  .setHandleInvalid("keep")

embarkedIndexer = StringIndexer()\
  .setInputCol("Embarked")\
  .setOutputCol("EmbarkedIndex")\
  .setHandleInvalid("keep")

vectorAssembler = VectorAssembler()\
  .setInputCols(["Pclass", "SexIndex", "Age", "SibSp", "Parch", "Fare", "CabinIndex", "EmbarkedIndex"])\
  .setOutputCol("features")
xgboost = XGBoostEstimator(
    featuresCol="features", 
    labelCol="Survival", 
    predictionCol="prediction"
)

pipeline = Pipeline().setStages([sexIndexer, cabinIndexer, embarkedIndexer, vectorAssembler, xgboost])
model = pipeline.fit(df)
model.transform(df).select(col("PassengerId"), col("prediction")).show()

model.save("model_xgboost")
loadedModel = Pipeline.load("model_xgboost")


IllegalArgumentException: u'requirement failed: Error loading metadata: Expected class name org.apache.spark.ml.Pipeline but found class name org.apache.spark.ml.PipelineModel'


#predict2 = loadedModel.transform(df)

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛

from pyspark.ml import PipelineModel
#model.save("model_xgboost")
loadedModel = PipelineModel.load("model_xgboost")

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

ml.dmlc.xgboost4j.scala.spark рдирд╛рдо рдХрд╛ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ

рджреЗрд╡ рдбрд╛рдЙрдирд▓реЛрдб рд▓рд┐рдВрдХ: Sparkxgb.zip

рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг XGBoost-0.8 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рдпрд╛ рдЗрд╕ рдереНрд░реЗрдб рдореЗрдВ рдпреЛрдЧрджрд╛рди рди рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд╛рдорд╛рди рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред
(рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ: рдореИрдВрдиреЗ рд╕реНрдкрд╛рд░реНрдХ 2.2 рдХреЗ рд▓рд┐рдП рд╕рднреА рдмреИрдХрдкреЛрд░реНрдЯ рд╣рдЯрд╛ рджрд┐рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдкрд╛рд░реНрдХ 2.3 рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)

рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдЬреЛ рдореБрдЭреЗ рдЙрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрдЧреАрдХрд░рдг рдореЙрдбрд▓ рд╕рд╣реЗрдЬреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ, рддреНрд░реБрдЯрд┐ рджреЗ рд░рд╣реЗ рд╣реИрдВ: TypeError: 'JavaPackage' object is not callable ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдЬреАрдм рддрд░рд╣ рд╕реЗ XGBoostPipelineModel XGBoost рд╡рд░реНрдЧреАрдХрд░рдг рдЪрд░рдг рдХреЗ рд╕рд╛рде рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рдЕрдВрдд рдореЗрдВ рдПрдХ рдореБрджреНрджрд╛ рд╣реИ, рдХреНрдпрд╛ рдХреЛрдИ рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдЧреАрдХрд░рдг рдореЙрдбрд▓ рдкрдврд╝рдирд╛ рдЙрдирдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ?

рднрд▓реЗ рд╣реА, рдореИрдВ DefaultParamsWritable рдХреЛ рдареАрдХ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рд╕рдорд░реНрдкрд┐рдд XGBoostPipeline рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛, рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдкрдврд╝рдиреЗ/рд▓рд┐рдЦрдиреЗ рдХрд╛ рдореБрджреНрджрд╛ рд╡реИрд╕реЗ рднреА рдЕрдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред (рдпрд╣ рднреА рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CrossValidator рдкрд░ рджреГрдврд╝рддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ)

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕