рд╕реНрдХрд╛рд▓рд╛ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рдПрдХ рддрддреНрдХрд╛рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╛ рдПрдХ рд╕реБрдЦрдж рдЕрд╡рд╕рд░?


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


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдпрд╣ рдкрдХреНрд╖ рдЗрддрдирд╛ рдЕрдВрдзреЗрд░рд╛ рд╣реИ? рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, "рдФрджреНрдпреЛрдЧрд┐рдХ" рдбреЗрдЯрд╛ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдЙрдкрдХрд░рдг рдиреЗ рдПрдХ рд▓рдВрдмрд╛ рд╕рдлрд░ рддрдп рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЖрдЬ рд╕реЗ 2-3 рд╕рд╛рд▓ рдкрд╣рд▓реЗ рд╡реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВред рдЖрдЗрдП SNA рд╣реИрдХрдереЙрди 2019 рдХрд╛рд░реНрдп рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рдЬрд╛рдирдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рд╕реНрдХреЗрд▓ + рд╕реНрдкрд╛рд░реНрдХ рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рд╕рд╛рдЗрдВрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдПрд╕рдПрдирдП рд╣реИрдХрдереЙрди 2019 рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ , рдкреНрд░рддрд┐рднрд╛рдЧреА рддреАрди "рд╡рд┐рд╖рдпреЛрдВ" рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб рдХреЛ рдЫрд╛рдБрдЯрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ: рдкрд╛рда, рдЪрд┐рддреНрд░ рдпрд╛ рдлреАрдЪрд░ рд▓реЙрдЧ рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕реНрдкрд╛рд░реНрдХ рдореЗрдВ рд╢рд╛рд╕реНрддреНрд░реАрдп рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд▓реЙрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИред


рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ, рд╣рдо рдХрд┐рд╕реА рдореЙрдбрд▓ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХреЗ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗ:


  • рд╣рдо рдЕрдиреБрд╕рдВрдзрд╛рди рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдЧреНрд░рд╛рдл рдмрдирд╛рдПрдВрдЧреЗред
  • рд╣рдо рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЧреБрдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдЙрдирдХреЗ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред
  • рд╣рдо рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЧреБрдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред
  • рд╣рдо рд╕рдВрдХреЗрддреЛрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рдЪрд░ рдХреЗ рдмреАрдЪ рд╕рд╣рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рдВрдХреЗрддреЛрдВ рдХреЗ рдмреАрдЪ рдХреНрд░реЙрд╕-рд╕рд╣рд╕рдВрдмрдВрдз рднреАред
  • рд╣рдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЕрдВрддрд┐рдо рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
  • рдЖрдЗрдП рд╣рдо рд╡рд┐рдХрд╛рд╕ рдмрд┐рдВрджреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред

рдЕрдкрдиреА "рдпрд╛рддреНрд░рд╛" рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЬрд╝реЗрдкреЗрд▓рд┐рди рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдиреЛрдЯрдмреБрдХ, рд╕реНрдкрд╛рд░реНрдХ рдПрдордПрд▓ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдЙрд╕рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ PravdaML , рдЧреНрд░рд╛рдлрдПрдХреНрд╕ рдЧреНрд░рд╛рдлрд┐рдВрдЧ рдкреИрдХреЗрдЬ, рд╡реЗрдЧрд╛рд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдХреЛ рдЗрд╕рдХреЗ рд╕рднреА рдЧреМрд░рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдРрд╕реЗ рдЙрдкрдХрд░рдгреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред )ред рд╕рднреА рдХреЛрдб рдФрд░ рдкреНрд░рдпреЛрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдо Zepl рд╕рд╣рдпреЛрдЧреА рдиреЛрдЯрдмреБрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред


рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ


рдПрд╕рдПрдирдП рд╣реИрдХрдереЙрди 2019 рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕реАрдзреЗ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ: рд╕реНрд░реЛрдд рдбреЗрдЯрд╛ рдЕрдкрд╛рдЪреЗ рд▓рдХрдбрд╝реА рдХреА рдЫрдд рдХреЙрд▓рдо рдкреНрд░рд╛рд░реВрдк рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЬрдм "рдорд╛рдереЗ рд╕реЗ рдореЗрдореЛрд░реА" рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХрдИ рдЯрди рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЕрдкрд╛рдЪреЗ рд╕реНрдкрд╛рд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдбреЗрдЯрд╛ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕реНрдкрд╛рд░реНрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдбрд┐рд╕реНрдХ рд╕реЗ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИред


рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓рд╛ рдХрджрдо - рджрд┐рди рдкрд░ рдбреЗрдЯрд╛ рдХреЗ рд╡рд┐рддрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ - рдмреЙрдХреНрд╕рд┐рдВрдЧ рдЯреВрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


val train = sqlContext.read.parquet("/events/hackatons/SNAHackathon/2019/collabTrain") z.show(train.groupBy($"date").agg( functions.count($"instanceId_userId").as("count"), functions.countDistinct($"instanceId_userId").as("users"), functions.countDistinct($"instanceId_objectId").as("objects"), functions.countDistinct($"metadata_ownerId").as("owners")) .orderBy("date")) 

Zeppelin рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдЧреНрд░рд╛рдл рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ :



рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛рдлреА рд▓рдЪреАрд▓рд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рди рдХреЛрдб рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:


 val train = sqlContext.read.parquet("/events/hackatons/SNAHackathon/2019/collabTrain") z.show( train groupBy $"date" agg( count($"instanceId_userId") as "count", countDistinct($"instanceId_userId") as "users", countDistinct($"instanceId_objectId") as "objects", countDistinct($"metadata_ownerId") as "owners") orderBy "date" ) 

рдпрд╣рд╛рдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреЗрддрд╛рд╡рдиреА рджреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП: рдЬрдм рдПрдХ рдмрдбрд╝реА рдЯреАрдо рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рд░ рдХреЛрдИ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕реНрд╡рд╛рдж рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдХрд╛рд▓рд╛-рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдкрд░реНрдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдВрдЪрд╛рд░ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдХреЛрдб рд╢реИрд▓реА рдХреА рдПрдХреАрдХреГрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред


рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдХрд╛рдо рдкрд░ рд╡рд╛рдкрд╕ред рджрд┐рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рд╕рд░рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдиреЗ 17 рдФрд░ 18 рдлрд░рд╡рд░реА рдХреЛ рдЕрд╕рд╛рдорд╛рдиреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджрд┐рдЦрд╛рдИ; рд╢рд╛рдпрдж рдЗрди рджрд┐рдиреЛрдВ рдЕрдзреВрд░рд╛ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг рдкрдХреНрд╖рдкрд╛рддреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдореЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рдбрд╝рддрд╛рд▓реА рд╣реИ рдХрд┐ рдЕрджреНрд╡рд┐рддреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ:


 z.show(filteredTrain .groupBy($"instanceId_userId").count .groupBy("count").agg(functions.log(functions.count("count")).as("withCount")) .orderBy($"withCount".desc) .limit(100) .orderBy($"count")) 


рдмрд╣реБрдд рд▓рдВрдмреА рдкреВрдВрдЫ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рддрд░рдг рдХреЛ рдШрд╛рддреАрдп рдХреЗ рдХрд░реАрдм рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрддрд░реЛрдВ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЙрдбрд▓ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдХреЗ рдХрд╛рдо рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд┐рддрд░рдг рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ:



рдкрд░реАрдХреНрд╖рдг рдХреА рддреБрд▓рдирд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдкрд╛рд╕ рд▓реЙрдЧ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ (рдЪреВрдВрдХрд┐ рд░реИрдВрдХрд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИрдХрд╛рдереЙрди рдкрд░ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИ, рдпрд╣ рдЧреБрдгрд╡рддреНрддрд╛ рдХрд╛ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрдд рд╣реИ)ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдореИрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:


 //  ,     "",   , //     val testSimilar = sc.broadcast(filteredTrain.groupBy($"instanceId_userId") .agg( functions.count("feedback").as("count"), functions.sum(functions.expr("IF(array_contains(feedback, 'Liked'), 1.0, 0.0)")).as("sum") ) .where("count > sum AND sum > 0") .select("instanceId_userId").rdd.map(_.getInt(0)).collect.sorted) //           // User Defined Function val isTestSimilar = sqlContext.udf.register("isTestSimilar", (x: Int) => java.util.Arrays.binarySearch(testSimilar.value, x) >= 0) 

рдпрд╣рд╛рдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯрд┐рдкреНрдкрдгреА рднреА рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП: рдпрд╣ рдпреВрдбреАрдПрдл рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╣реИ рдХрд┐ рд╕реНрдХрд╛рд░ / рдЬрд╛рд╡рд╛ рдХреЗ рддрд╣рдд рдФрд░ рдкрд╛рдпрдерди рдХреЗ рддрд╣рдд рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред рдЬрдмрдХрд┐ PySpark рдХреЛрдб рдореВрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рд▓рдЧрднрдЧ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдУрд╡рд░рд░рд╛рдЗрдб рдлрд╝рдВрдХреНрд╢рди рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рддреЛ PySpark рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░рд┐рдорд╛рдг рдХреЗ рдПрдХ рдХреНрд░рдо рд╕реЗ рдШрдЯ рдЬрд╛рддрд╛ рд╣реИред


рдкрд╣рд▓реА рдПрдордПрд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди


рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдореВрд▓ рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕реНрдкрд╛рд░реНрдХрдПрдордПрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рдЗрд╕рдХреА рд╕рд╛рдорд╛рдиреНрдп рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ:



SparkML рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:


  • рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ - рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕реЗрдЯ (рдкрд░рд┐рд╡рд░реНрддрди) рджреЗрддрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реА- рдФрд░ рдкреЛрд╕реНрдЯрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, рд╕реБрд╡рд┐рдзрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдореА рдПрдордПрд▓-рдореЙрдбрд▓ рдХрд╛ рднреА рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдЕрдиреБрдорд╛рдирдХ - рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛ рд╕реЗрдЯ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ (рдлрд┐рдЯ) рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрдиреБрдорд╛рдирдХ рдПрдордПрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
  • рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдПрд╕реНрдЯрд┐рдореЗрдЯрд░ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдФрд░ рдЕрдиреБрдорд╛рдирдХреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЬрдм рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рдЯ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдПрдХ рдЕрдиреБрдорд╛рдирдХ рджреЗрдЦрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред
  • PipelineModel - рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рднреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рд╣реЛрддреЗ рд╣реИрдВред рддрджрдиреБрд╕рд╛рд░, рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд▓рд╛рдЗрдирдореЙрдбрд▓ рднреА рдПрдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рд╣реИред

рдПрдордПрд▓-рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдореЙрдбреНрдпреВрд▓рд░ рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдЕрдЪреНрдЫрд╛ рдкреНрд░рдЬрдирди рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИ - рджреЛрдиреЛрдВ рдореЙрдбрд▓ рдФрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рд▓ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреНрд╖реЗрддреНрд░) рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:


 val feedbackAggregator = new Pipeline().setStages(Array( //         (feedback)  one-hot  new MultinominalExtractor().setInputCol("feedback").setOutputCol("feedback"), //       new VectorStatCollector() .setGroupByColumns("date").setInputCol("feedback") .setPercentiles(Array(0.1,0.5,0.9)), //        new VectorExplode().setValueCol("feedback") )).fit(train) z.show(feedbackAggregator .transform(filteredTrain) .orderBy($"date", $"feedback")) 

рдЗрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ, PravdaML рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ - рд╕реНрдкрд╛рд░реНрдХрдПрдордПрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдЙрдкрдпреЛрдЧреА рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреБрд╕реНрддрдХрд╛рд▓рдп, рдЕрд░реНрдерд╛рддреН:


  • рдорд▓реНрдЯрд┐рдиреЛрдорд╛рдЗрдирд▓рдПрдХреНрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ-рдЧрд░реНрдо рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ "рдРрд░реЗ рдСрдлрд╝ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕" рдХреЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рдЕрдиреБрдорд╛рдирдХ рд╣реИ (рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдбреЗрдЯрд╛рд╕реЗрдЯ рд╕реЗ рдЕрджреНрд╡рд┐рддреАрдп рд▓рд╛рдЗрдиреЗрдВ рдПрдХрддреНрд░ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП)ред
  • рд╡реЗрдХреНрдЯрд░ рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдХреНрдЯрд░рд╕реНрдЯреИрдЯ рдХрд▓рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • рд╡реЗрдХреНрдЯрд░рдПрдХреНрд╕рдкреНрд▓реЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХрд╛рд░реНрдп рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рд╕рдВрддреБрд▓рд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд▓рдХреНрд╖реНрдп рдХреЗ рд▓рд┐рдП рдЕрд╕рдВрддреБрд▓рди рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдЧ рдЪрд░рдо рдирд╣реАрдВ рд╣реИ:



рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рд╡рд┐рддрд░рдг рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг (рджреЛрдиреЛрдВ рд▓реЙрдЧ рдореЗрдВ "рд╕рдХрд╛рд░рд╛рддреНрдордХ" рдФрд░ "рдирдХрд╛рд░рд╛рддреНрдордХ" рд╣реЛрдиреЗ) рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╡рд░реНрдЧ рдХреЗ рдкрдХреНрд╖рдкрд╛рддреА рд╣реИ:



рд╕рдВрдХреЗрддреЛрдВ рдХрд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдЧреБрдгреЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рд╕рдордп рд╣рдореЗрдВ рдПрдХ рдмрдбрд╝реЗ рдХрдиреНрд╡реЗрдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 val statsAggregator = new Pipeline().setStages(Array( new NullToDefaultReplacer(), //          new AutoAssembler() .setColumnsToExclude( (Seq("date", "feedback") ++ train.schema.fieldNames.filter(_.endsWith("Id")) : _*)) .setOutputCol("features"), new VectorStatCollector() .setGroupByColumns("date").setInputCol("features") .setPercentiles(Array(0.1,0.5,0.9)), new VectorExplode().setValueCol("features") )) 

рдЪреВрдВрдХрд┐ рдЕрдм рд╣рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╣рдо рджреЛ рдФрд░ рдЙрдкрдпреЛрдЧреА рдкреНрд░рд╡реАрдг рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:


  • NullToDefaultReplacer рдЖрдкрдХреЛ рдЙрдирдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди (рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП 0, рддрд╛рд░реНрдХрд┐рдХ рдЪрд░ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд, рдЖрджрд┐) рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдореЗрдВ рд▓рд╛рдкрддрд╛ рддрддреНрд╡реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдпрд╣ рд░реВрдкрд╛рдВрддрд░рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╡реИрдХреНрдЯрд░ рдореЗрдВ NaN рдорд╛рди рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдЬреЛ рдХрдИ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдШрд╛рддрдХ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, XGBoost рдЗрд╕ рд╕реЗ рдмрдЪ рд╕рдХрддрд╛ рд╣реИ)ред рд╢реВрдиреНрдп рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдФрд╕рдд рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ NaNToMeanReplacerEstimator рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • AutoAssembler рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреА рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрдВрдн рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдпреЛрдЬрдирд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИ рдЬреЛ рд╕реНрддрдВрдн рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред

рдкрд░рд┐рдгрд╛рдореА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рддреАрди рд╕реЗрдЯ (рдкреНрд░рд╢рд┐рдХреНрд╖рдг, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдкреНрд░рд╢рд┐рдХреНрд╖рдг) рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдБрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:


 //   (   AutoAssembler  ) val trained = statsAggregator.fit(filteredTrain) //       - ,     . trained .transform(filteredTrain .withColumn("date", //  ,      ,     , //        All   functions.explode(functions.array(functions.lit("All"), $"date")))) .coalesce(7).write.mode("overwrite").parquet("sna2019/featuresStat") trained .transform(filteredTrain .where(isTestSimilar($"instanceId_userId")) .withColumn("date", functions.explode(functions.array(functions.lit("All"), $"date")))) .coalesce(7).write.mode("overwrite").parquet("sna2019/filteredFeaturesStat") trained .transform(filteredTest.withColumn("date", functions.explode(functions.array(functions.lit("All"), $"date")))) .coalesce(3).write.mode("overwrite").parquet("sna2019/testFeaturesStat") 

рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рддреАрди рдбреЗрдЯрд╛рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВ:


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

рдЗрди рдкрд╣рд▓реБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА:


 def compareWithTest(data: DataFrame) : DataFrame = { data.where("date = 'All'") .select( $"features", //         // ( ) functions.log($"features_mean" / $"features_p50").as("skewenes"), //    90-      //    90-  тАФ    functions.log( ($"features_max" - $"features_p90") / ($"features_p90" - $"features_p50")).as("outlieres"), //       ,  //    ($"features_nonZeros" / $"features_count").as("train_fill"), $"features_mean".as("train_mean")) .join(testStat.where("date = 'All'") .select($"features", $"features_mean".as("test_mean"), ($"features_nonZeros" / $"features_count").as("test_fill")), Seq("features")) //          .withColumn("meanDrift", (($"train_mean" - $"test_mean" ) / ($"train_mean" + $"test_mean"))) //      .withColumn("fillDrift", ($"train_fill" - $"test_fill") / ($"train_fill" + $"test_fill")) } //         val comparison = compareWithTest(trainStat).withColumn("mode", functions.lit("raw")) .unionByName(compareWithTest(filteredStat).withColumn("mode", functions.lit("filtered"))) 

рдЗрд╕ рд╕реНрддрд░ рдкрд░, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╢реНрди рдЕрддреНрдпрд╛рд╡рд╢реНрдпрдХ рд╣реИ: рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЬрд╝реЗрдкреЗрд▓рд┐рди рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдкрд╣рд▓реБрдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╕рд╛рде рдиреЛрдЯрдмреБрдХ рдлреВрд▓рд╛ рд╣реБрдЖ рдбреЛрдо рдХреЗ рдХрд╛рд░рдг рдзреАрд░реЗ-рдзреАрд░реЗ рдзреАрдорд╛ рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рд╡реЗрдЧрд╛-рд▓рд╛рдЗрдЯ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реНрдХрд╛рд▓рд╛ рдкрд░ рд╡реЗрдЧрд╛рд╕ - рдбреАрдПрд╕рдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡реЗрдЧрд╛рд╕ рди рдХреЗрд╡рд▓ рд╕рдореГрджреНрдз рджреГрд╢реНрдп рдХреНрд╖рдорддрд╛рдУрдВ (matplotlib рдХреЗ рдмрд░рд╛рдмрд░) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ DOM :) рдХреЛ рдлреБрд▓рд╛рдП рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдХреИрдирд╡рд╕ рдкрд░ рднреА рдЦреАрдВрдЪрддрд╛ рд╣реИред


рд╣рдо рдЬрд┐рд╕ рдЪрд╛рд░реНрдЯ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ:


 vegas.Vegas(width = 1024, height = 648) //   .withDataFrame(comparison.na.fill(0.0)) //           .encodeX("meanDrift", Quant, scale = Scale(domainValues = List(-1.0, 1.0), clamp = true)) //   -       .encodeY("train_fill", Quant) //       .encodeColor("outlieres", Quant, scale=Scale( rangeNominals=List("#00FF00", "#FF0000"), domainValues = List(0.0, 5), clamp = true)) //       .encodeSize("skewenes", Quant) //   -   (   ) .encodeShape("mode", Nom) .mark(vegas.Point) .show 

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЪрд╛рд░реНрдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:


  • рдПрдХреНрд╕ рдЕрдХреНрд╖ рдкрд░реАрдХреНрд╖рдг рдФрд░ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ (0 рдХреЗ рдХрд░реАрдм, рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рд╕рдВрдХреЗрдд) рдХреЗ рдмреАрдЪ рд╡рд┐рддрд░рдг рдХреЗрдВрджреНрд░реЛрдВ рдХреА рдкрд╛рд░реА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
  • рдЧреИрд░-рдЕрдХреНрд╖реАрдп рддрддреНрд╡реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рд╡рд╛рдИ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде рдкреНрд▓реЙрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЙрдЪреНрдЪрддрд░, рд╡рд┐рд╢реЗрд╖рддрд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЕрдВрдХ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдбреЗрдЯрд╛)ред
  • рдЖрдХрд╛рд░ рдФрд╕рдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдФрд╕рддрди рдХреЗ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ (рдмрдбрд╝рд╛ рдмрд┐рдВрджреБ, рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд┐рдЬрд▓реА рдХрд╛рдиреВрди рд╡рд┐рддрд░рдг)ред
  • рд░рдВрдЧ рдЙрддреНрд╕рд░реНрдЬрди (рд░реЗрдбрд░, рдЕрдзрд┐рдХ рдЙрддреНрд╕рд░реНрдЬрди) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • рдЦреИрд░, рдлреЙрд░реНрдо рдПрдХ рддреБрд▓рдирд╛ рдореЛрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИ: рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗред


рддреЛ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:


  • рдХреБрдЫ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рдПрдХ рдЙрддреНрд╕рд░реНрдЬрди рдлрд┐рд▓реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рд╣рдо 90 рд╡реЗрдВ рдкреНрд░рддрд┐рд╢рдд рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗред
  • рдХреБрдЫ рд╕рдВрдХреЗрдд рдШрд╛рддрд╛рдВрдХ рдХреЗ рдХрд░реАрдм рд╡рд┐рддрд░рдг рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ - рд╣рдо рд▓рдШреБрдЧрдгрдХ рд▓реЗрдВрдЧреЗред
  • рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ - рд╣рдо рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрдВрдЧреЗред

рд╕рд╣рд╕рдВрдмрдВрдз рд╡рд┐рд╢реНрд▓реЗрд╖рдг


рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдХреИрд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдЖрдЗрдП рд╕рд╣рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдЕрд╡рд▓реЛрдХрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдлреАрдЪрд░ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:


 //             val expressions = filteredTrain.schema.fieldNames //          .filterNot(x => x == "date" || x == "audit_experiment" || idsColumns(x) || x.contains("vd_")) .map(x => if(skewedFeautres(x)) { //      s"log($x) AS $x" } else { //     cappedFeatures.get(x).map(capping => s"IF($x < $capping, $x, $capping) AS $x").getOrElse(x) }) val rawFeaturesExtractor = new Pipeline().setStages(Array( new SQLTransformer().setStatement(s"SELECT ${expressions.mkString(", ")} FROM __THIS__"), new NullToDefaultReplacer(), new AutoAssembler().setOutputCol("features") )) //       val raw = rawFeaturesExtractor.fit(filteredTrain).transform( filteredTrain.where(isTestSimilar($"instanceId_userId"))) 

рдЗрд╕ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдирдИ рдорд╢реАрдирд░реА рдореЗрдВ, SQLTransformer рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреА рд╣реИ, рдЬреЛ рдЗрдирдкреБрдЯ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ SQL рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред


рд╕рд╣рд╕рдВрдмрдВрдзреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╕рдордп, рдПрдХ-рдЧрд░реНрдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рд╣рд╕рдВрдмрдВрдз рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдорд┐рдд рд╢реЛрд░ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╡реЗрдХреНрдЯрд░ рдХреЗ рдХреМрди рд╕реЗ рддрддреНрд╡ рдХрд┐рд╕ рд╕реНрд░реЛрдд рдХреЙрд▓рдо рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред рд╕реНрдкрд╛рд░реНрдХ рдореЗрдВ рдпрд╣ рдХрд╛рд░реНрдп рдХреЙрд▓рдо рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд) рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЛрдб рдХрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмреНрд▓реЙрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдПрдХ рд╣реА рдХреЙрд▓рдо рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╢реЗрд╖рддрд╛ рдирд╛рдореЛрдВ рдХреЗ рдЬреЛрдбрд╝реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


 val attributes = AttributeGroup.fromStructField(raw.schema("features")).attributes.get val originMap = filteredTrain .schema.filter(_.dataType == StringType) .flatMap(x => attributes.map(_.name.get).filter(_.startsWith(x.name + "_")).map(_ -> x.name)) .toMap //   ,          val isNonTrivialCorrelation = sqlContext.udf.register("isNonTrivialCorrelation", (x: String, y : String) => //    Scala-quiz   Option originMap.get(x).map(_ != originMap.getOrElse(y, "")).getOrElse(true)) 

рд╡реЗрдХреНрдЯрд░ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдкрд░ рд╣рд╛рде рд░рдЦрдиреЗ рд╕реЗ, рд╕реНрдкрд╛рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд░реЙрд╕-рд╕рд╣рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ, рдЬрд┐рд╕рдХреА рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреЛрдбрд╝реЗ рдХреЗ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЦреЗрд▓рдирд╛ рд╣реЛрдЧрд╛:


 val pearsonCorrelation = //    Pearson  Spearman Correlation.corr(raw, "features", "pearson").rdd.flatMap( //           _.getAs[Matrix](0).rowIter.zipWithIndex.flatMap(x => { //   ,   (  , //  ) val name = attributes(x._2).name.get //    ,     x._1.toArray.zip(attributes).map(y => (name, y._2.name.get, y._1)) } //     DataFrame )).toDF("feature1", "feature2", "corr") .na.drop //   .where(isNonTrivialCorrelation($"feature1", $"feature2")) //    . pearsonCorrelation.coalesce(1).write.mode("overwrite") .parquet("sna2019/pearsonCorrelation") 

рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди: рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЧрд░реНрдореА рдХрд╛ рдирдХреНрд╢рд╛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡реЗрдЧрд╛рд╕ рдХреА рдорджрдж рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрдЧреА:


 vegas.Vegas("Pearson correlation heatmap") .withDataFrame(pearsonCorrelation .withColumn("isPositive", $"corr" > 0) .withColumn("abs_corr", functions.abs($"corr")) .where("feature1 < feature2 AND abs_corr > 0.05") .orderBy("feature1", "feature2")) .encodeX("feature1", Nom) .encodeY("feature2", Nom) .encodeColor("abs_corr", Quant, scale=Scale(rangeNominals=List("#FFFFFF", "#FF0000"))) .encodeShape("isPositive", Nom) .mark(vegas.Point) .show 

рдкрд░рд┐рдгрд╛рдо Zepl-e рдореЗрдВ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмреЗрд╣рддрд░ рд╣реИред рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдордЭ рдХреЗ рд▓рд┐рдП:



рд╣реАрдЯ рдореИрдк рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рд╕рд╣рд╕рдВрдмрдВрдз рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдВ рд╣реИрдВред рдЖрдЗрдП рд╕рдмрд╕реЗ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рд╣рд╕рдВрдмрджреНрдз рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмреНрд▓реЙрдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдЧреНрд░рд╛рдлрдПрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рд╕рд╣рд╕рдВрдмрдВрдз рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рдПрдХ рдЧреНрд░рд╛рдл рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ, рд╡рдЬрди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЬреБрдбрд╝реЗ рдШрдЯрдХреЛрдВ рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рдЧреИрд░-рдЕрдз: рдкрддрди рд╡рд╛рд▓реЗ (рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рддрддреНрд╡реЛрдВ рд╕реЗ) рдЫреЛрдбрд╝рддреЗ рд╣реИрдВред рдРрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдбреАрдмреАрдПрд╕рд╕реАрдПрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рд╕рдорд╛рди рд╣реИ рдФрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:


 //   (GrpahX   ID) val featureIndexMap = spearmanCorrelation.select("feature1").distinct.rdd.map( _.getString(0)).collect.zipWithIndex.toMap val featureIndex = sqlContext.udf.register("featureIndex", (x: String) => featureIndexMap(x)) //    val vertices = sc.parallelize(featureIndexMap.map(x => x._2.toLong -> x._1).toSeq, 1) //    val edges = spearmanCorrelation.select(featureIndex($"feature1"), featureIndex($"feature2"), $"corr") //     .where("ABS(corr) > 0.7") .rdd.map(r => Edge(r.getInt(0), r.getInt(1), r.getDouble(2))) //       val components = Graph(vertices, edges).connectedComponents() val reversedMap = featureIndexMap.map(_.swap) //    ,    ,   //   val clusters = components .vertices.map(x => reversedMap(x._2.toInt) -> reversedMap(x._1.toInt)) .groupByKey().map(x => x._2.toSeq) .filter(_.size > 1) .sortBy(-_.size) .collect 

рдкрд░рд┐рдгрд╛рдо рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:



рдХреНрд▓рд╕реНрдЯрд░рд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдореВрд╣ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рджрд╕реНрдпрддрд╛ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рдВрдХреЗрддреЛрдВ (рд╕рджрд╕реНрдпрддрд╛_рд╕реНрдЯреИрдЯрд╕_рдП) рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ (InstId_objectType) рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рд╣рд╕рдВрдмрджреНрдз рд╕рдореВрд╣ рдмрдирд╛рдП рдЧрдП рд╣реИрдВред рд╕рдВрдХреЗрддреЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдореЙрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореЙрдбрд▓ рд╡рд┐рднрд╛рдЬрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ - рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдореЙрдбрд▓ рдХреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реИ рдФрд░ рдирд╣реАрдВ рд╣реИред


рдорд╢реАрди рд╕реАрдЦрдиреЗ


рд╣рдо рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ - рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧред SparkML рдФрд░ PravdaML рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░рд▓рддрдо рдореЙрдбрд▓ (рд▓реЙрдЬрд┐рд╕реНрдЯрд┐рдХ рд░рд┐рдЧреНрд░реЗрд╢рди) рдХрд╛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рджреЗрдиреЗ рдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


  new Pipeline().setStages(Array( new SQLTransformer().setStatement( """SELECT *, IF(array_contains(feedback, 'Liked'), 1.0, 0.0) AS label FROM __THIS__"""), new NullToDefaultReplacer(), new AutoAssembler() .setColumnsToExclude("date", "instanceId_userId", "instanceId_objectId", "feedback", "label") .setOutputCol("features"), Scaler.scale(Interceptor.intercept(UnwrappedStage.repartition( new LogisticRegressionLBFSG(), numPartitions = 127))) 

рдпрд╣рд╛рдВ рд╣рдо рди рдХреЗрд╡рд▓ рдХрдИ рдкрд░рд┐рдЪрд┐рдд рддрддреНрд╡реЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдХрдИ рдирдП рднреА рд╣реИрдВ:


  • LogisticRegressionLBFSG рдПрдХ рдЕрдиреБрдорд╛рдирдХ рд╣реИ рдЬреЛ рд▓реЙрдЬрд┐рд╕реНрдЯрд┐рдХ рдкреНрд░рддрд┐рдЧрдорди рдХреЗ рд╡рд┐рддрд░рд┐рдд рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд╕рд╛рде рд╣реИред
  • рд╡рд┐рддрд░рд┐рдд рдПрдордПрд▓-рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реЗ рдЕрдзрд┐рдХрддрдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рд╡рд┐рднрд╛рдЬрди рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред UnwrappedStage.repartition рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░реЗрдЧреА, рдкрд╛рдЗрдк рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд┐рдкрд╛рд░реНрдЯрд┐рд╢рди рдСрдкрд░реЗрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдЪрд░рдг рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЬрдм рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ)ред
  • рддрд╛рдХрд┐ рд░реИрдЦрд┐рдХ рдореЙрдбрд▓ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗ рд╕рдХреЗред рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП Scaler.scale рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рджреЛ рд▓рдЧрд╛рддрд╛рд░ рд░реИрдЦрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ (рдкреНрд░рддрд┐рдЧрдорди рднрд╛рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдФрд░ рдЧреБрдгрд╛) рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЦрд░реНрдЪреЛрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдзреНрд╡рд╕реНрдд рдХрд░рдирд╛ рд╡рд╛рдВрдЫрдиреАрдп рд╣реИред PravdaML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдл рдореЙрдбрд▓ рд╣реЛрдЧрд╛ :)ред
  • рдареАрдХ рд╣реИ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдРрд╕реЗ рдореЙрдбрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рд╕рджрд╕реНрдп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯрд░.рдЗрдиреНрдЯрд░рд╕реЗрдкреНрдЯ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдореА рдкрд╛рдЗрдкрд▓рд╛рдЗрди, рд╕рднреА рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рдкреНрд░рддрд┐-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ AUC 0.6889 (рд╕рддреНрдпрд╛рдкрди рдХреЛрдб Zepl рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ) рджреЗрддреА рд╣реИред рдЕрдм рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рднреА рд╢реЛрдзреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ: рдбреЗрдЯрд╛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ, рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдмрджрд▓реЗрдВ, рдФрд░ рдЦрдВрдб рдореЙрдбрд▓ред рдЕрдВрддрд┐рдо рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


  new Pipeline().setStages(Array( new SQLTransformer().setStatement(s"SELECT instanceId_userId, instanceId_objectId, ${expressions.mkString(", ")} FROM __THIS__"), new SQLTransformer().setStatement("""SELECT *, IF(array_contains(feedback, 'Liked'), 1.0, 0.0) AS label, concat(IF(membership_status = 'A', 'OwnGroup_', 'NonUser_'), instanceId_objectType) AS type FROM __THIS__"""), new NullToDefaultReplacer(), new AutoAssembler() .setColumnsToExclude("date", "instanceId_userId", "instanceId_objectId", "feedback", "label", "type","instanceId_objectType") .setOutputCol("features"), CombinedModel.perType( Scaler.scale(Interceptor.intercept(UnwrappedStage.repartition( new LogisticRegressionLBFSG(), numPartitions = 127))), numThreads = 6) )) 

PravdaML тАФ CombinedModel.perType. , numThreads = 6. .


, , per-user AUC 0.7004. ? , " " XGBoost :


 new Pipeline().setStages(Array( new SQLTransformer().setStatement("""SELECT *, IF(array_contains(feedback, 'Liked'), 1.0, 0.0) AS label FROM __THIS__"""), new NullToDefaultReplacer(), new AutoAssembler() .setColumnsToExclude("date", "instanceId_userId", "instanceId_objectId", "feedback", "label") .setOutputCol("features"), new XGBoostRegressor() .setNumRounds(100) .setMaxDepth(15) .setObjective("reg:logistic") .setNumWorkers(17) .setNthread(4) .setTrackerConf(600000L, "scala") )) 

, тАФ XGBoost Spark ! DLMC , PravdaML , ( ). XGboost " " 10 per-user AUC 0.6981.



, , , . SparkML , . PravdaML : Parquet Spark:


 //     val perTypeWeights = sqlContext.read.parquet("sna2019/perType/stages/*/weights") //     20    ( //  ) val topFeatures = new TopKTransformer[Double]() .setGroupByColumns("type") .setColumnToOrderGroupsBy("abs_weight") .setTopK(20) .transform(perTypeWeights.withColumn("abs_weight", functions.abs($"unscaled_weight"))) .orderBy("type", "unscaled_weight") 

Parquet, PravdaML тАФ TopKTransformer, .


Vegas ( Zepl ):



, - . XGBoost?


 val significance = sqlContext.read.parquet( "sna2019/xgBoost15_100_raw/stages/*/featuresSignificance" vegas.Vegas() .withDataFrame(significance.na.drop.orderBy($"significance".desc).limit(40)) .encodeX("name", Nom, sortField = Sort("significance", AggOps.Mean)) .encodeY("significance", Quant) .mark(vegas.Bar) .show 


, , XGBoost, , . . , XGBoost , , .


рдирд┐рд╖реНрдХрд░реНрд╖


, :). :


  1. , Scala Spark , , , , .
  2. Scala Spark Python: ETL ML, , , .
  3. , , , (, ) , , .
  4. , , . , , , -, .

, , , , -. , , " Scala " Newprolab.


, , тАФ SNA Hackathon 2019 .

Source: https://habr.com/ru/post/hi442688/


All Articles