рдПрдирд░реЙрди рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдзреЛрдЦрд╛рдзрдбрд╝реА рдХреА рдкрд╣рдЪрд╛рди рдХрд░реЗрдВред рднрд╛рдЧ 1, рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдФрд░ рдкреНрд░рд╡реЗрд╢ рдХрд╛ рдЪрдпрди

рдПрдирд░реЙрди рдХреЙрд░реНрдкреЛрд░реЗрд╢рди 2000 рдХреЗ рджрд╢рдХ рдореЗрдВ рдЕрдореЗрд░рд┐рдХреА рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдЖрдВрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдпрд╣ рдЙрдирдХреА рдЧрддрд┐рд╡рд┐рдзрд┐ рдХреЗ рдХреНрд╖реЗрддреНрд░ (рдмрд┐рдЬрд▓реА рдФрд░ рдЗрд╕рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз) рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдореЗрдВ рдзреЛрдЦрд╛рдзрдбрд╝реА рдХреЗ рдХрд╛рд░рдг рдкреНрд░рддрд┐рдзреНрд╡рдирд┐ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЧрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 15 рд╡рд░реНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП, рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЖрдп рддреЗрдЬреА рд╕реЗ рдмрдврд╝реА рд╣реИ, рдФрд░ рдЗрд╕рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЕрдЪреНрдЫреЗ рд╡реЗрддрди рдХрд╛ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рд╕рд┐рд░реНрдл рдмреЗрдбрд╝реЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛: 2000-2001 рдХреА рдЕрд╡рдзрд┐ рдореЗрдВред рдШреЛрд╖рд┐рдд рдЖрдп рдХреЗ рд╕рд╛рде рдзреЛрдЦрд╛рдзрдбрд╝реА рдХреЗ рдХрд╛рд░рдг рд╢реЗрдпрд░ рдХреА рдХреАрдордд $ 90 / рдпреВрдирд┐рдЯ рд╕реЗ рдЧрд┐рд░рдХрд░ рд▓рдЧрднрдЧ рд╢реВрдиреНрдп рд╣реЛ рдЧрдИред рддрдм рд╕реЗ, "рдПрдирд░реЙрди" рд╢рдмреНрдж рдПрдХ рдШрд░реЗрд▓реВ рд╢рдмреНрдж рдмрди рдЧрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рдорд╛рди рдкреИрдЯрд░реНрди рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред


рдореБрдХрджрдореЗ рдХреЗ рджреМрд░рд╛рди 18 рд▓реЛрдЧреЛрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рдкреНрд░рддрд┐рд╡рд╛рджреА: рдПрдВрдбреНрд░рдпреВ рдлрд╛рд╕реНрдЯреЛрд╡, рдЬреЗрдл рд╕реНрдХрд┐рд▓рд┐рдВрдЧ рдФрд░ рдХреЗрдиреЗрде рд▓реЗ) рдХреЛ рджреЛрд╖реА рдард╣рд░рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдЫрд╡рд┐! [рдЫрд╡рд┐] (http: // https: //habrastorage.org/webt/te/rh/1l/terh1lsenbtg26n8nhjbhv3opfi.jpeg)


рдЗрд╕реА рд╕рдордп, рдХрдВрдкрдиреА рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдкрддреНрд░рд╛рдЪрд╛рд░ рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣, рдЬрд┐рд╕реЗ рдПрдирд░реЙрди рдИрдореЗрд▓ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдХрдВрдкрдиреА рдХреЗ рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреА рдЖрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдВрджрд░реВрдиреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рдХрд╛рд╢рд┐рдд рдХреА рдЧрдИ рдереАред


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


рдбреЗрдЯрд╛рд╕реЗрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг


рдПрдирд░реЙрди рдбреЗрдЯрд╛рд╕реЗрдЯ (рдбреЗрдЯрд╛рд╕реЗрдЯ) рдЦреБрд▓реЗ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдордЧреНрд░ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛рджрдЧрд╛рд░ рдирд┐рдЧрдо рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рд╣реЛрддреЗ рд╣реИрдВред
рдпрд╣ 3 рднрд╛рдЧреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


  • payment_features - рдПрдХ рд╕рдореВрд╣ рдЬреЛ рд╡рд┐рддреНрддреАрдп рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ;
  • stock_features - рдПрдХ рд╕рдореВрд╣ рдЬреЛ рд╕реНрдЯреЙрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ;
  • email_features - рдПрдХ рд╕рдореВрд╣ рдЬреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рдИрдореЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред

рдмреЗрд╢рдХ, рдПрдХ рд▓рдХреНрд╖реНрдп рдЪрд░ рднреА рд╣реИ рдЬреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдзреЛрдЦрд╛рдзрдбрд╝реА ( 'рдкреЛрдИ' рдХрд╛ рд╕рдВрдХреЗрдд ) рдкрд░ рд╕рдВрджреЗрд╣ рд╣реИ ред

рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ:


import pickle with open("final_project/enron_dataset.pkl", "rb") as data_file: data_dict = pickle.load(data_file) 

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкрдВрдбрд┐рдд рдбреЗрдЯрд╛рдлрд╝рдВрдб рдореЗрдВ рдкрдВрдбрд┐рдд рд╕реЗрдЯ рдХрд░реЗрдВред


 import pandas as pd import warnings warnings.filterwarnings('ignore') source_df = pd.DataFrame.from_dict(data_dict, orient = 'index') source_df.drop('TOTAL',inplace=True) 

рд╣рдо рдкрд╣рд▓реЗ рд╕рдВрдХреЗрддрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕рдореВрд╣рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдмрд╛рдж рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


 payments_features = ['salary', 'bonus', 'long_term_incentive', 'deferred_income', 'deferral_payments', 'loan_advances', 'other', 'expenses', 'director_fees', 'total_payments'] stock_features = ['exercised_stock_options', 'restricted_stock', 'restricted_stock_deferred','total_stock_value'] email_features = ['to_messages', 'from_poi_to_this_person', 'from_messages', 'from_this_person_to_poi', 'shared_receipt_with_poi'] target_field = 'poi' 

рд╡рд┐рддреНрддреАрдп рдбреЗрдЯрд╛


рдЗрд╕ рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдПрдХ NaN рдЬреНрдЮрд╛рдд рд╣реИ, рдФрд░ рдпрд╣ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЕрдВрддрд░ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдбреЗрдЯрд╛ рдлреНрд░реЗрдо рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд▓рд╛рдЗрди рд╕реЗ рдЬреБрдбрд╝реЗ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ NaN 0 рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЧреБрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред


 payments = source_df[payments_features] payments = payments.replace('NaN', 0) 

рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрди


рдбреЗрдЯрд╛рд╕реЗрдЯ рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓ рдкреАрдбреАрдПрдл рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдбреЗрдЯрд╛ рдереЛрдбрд╝рд╛ рд╡рд┐рдХреГрдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рднреБрдЧрддрд╛рди рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо рдореЗрдВ рд╕рднреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ , рдХреБрд▓_ рднреБрдЧрддрд╛рди рдлрд╝реАрд▓реНрдб рдЗрд╕ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рднреА рд╡рд┐рддреНрддреАрдп рд▓реЗрдирджреЗрди рдХрд╛ рдпреЛрдЧ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 errors = payments[payments[payments_features[:-1]].sum(axis='columns') != payments['total_payments']] errors.head() 

2 рдЕрдорд╛рдиреНрдп рд▓рд╛рдЗрдиреЗрдВ
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ BELFER ROBERT рдФрд░ BHATNAGAR SANJAY рдХреЗ рдкрд╛рд╕ рдЧрд▓рдд рднреБрдЧрддрд╛рди рд░рд╛рд╢рд┐ рд╣реИред


рдЖрдк рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдбреЗрдЯрд╛ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рдУрд░ рд▓реЗ рдЬрд╛рдХрд░ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕рднреА рднреБрдЧрддрд╛рдиреЛрдВ рдХрд╛ рдпреЛрдЧ рдЧрд┐рдирдХрд░ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 import numpy as np shifted_values = payments.loc['BELFER ROBERT', payments_features[1:]].values expected_payments = shifted_values.sum() shifted_values = np.append(shifted_values, expected_payments) payments.loc['BELFER ROBERT', payments_features] = shifted_values shifted_values = payments.loc['BHATNAGAR SANJAY', payments_features[:-1]].values payments.loc['BHATNAGAR SANJAY', payments_features] = np.insert(shifted_values, 0, 0) 

рд╕реНрдЯреЙрдХ рдбреЗрдЯрд╛


 stocks = source_df[stock_features] stocks = stocks.replace('NaN', 0) 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдЬрд╛рдБрдЪ рднреА рдХрд░реЗрдВ:


 errors = stocks[stocks[stock_features[:-1]].sum(axis='columns') != stocks['total_stock_value']] errors.head() 

рдЫрд╡рд┐


рд╣рдо рдЗрд╕реА рддрд░рд╣ рд╢реЗрдпрд░реЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдХреЛ рдареАрдХ рдХрд░реЗрдВрдЧреЗ:


 shifted_values = stocks.loc['BELFER ROBERT', stock_features[1:]].values expected_payments = shifted_values.sum() shifted_values = np.append(shifted_values, expected_payments) stocks.loc['BELFER ROBERT', stock_features] = shifted_values shifted_values = stocks.loc['BHATNAGAR SANJAY', stock_features[:-1]].values stocks.loc['BHATNAGAR SANJAY', stock_features] = np.insert(shifted_values, 0, shifted_values[-1]) 

рдИрдореЗрд▓ рдкрддреНрд░рд╛рдЪрд╛рд░


рдЕрдЧрд░ рдЗрди рд╡рд┐рддреНрдд рдпрд╛ рд╕реНрдЯреЙрдХ рдХреЗ рд▓рд┐рдП NaN 0 рдХреЗ рдмрд░рд╛рдмрд░ рдерд╛, рдФрд░ рдпрд╣ рдЗрди рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдИрдореЗрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ NaN рдХреБрдЫ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Imputer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 from sklearn.impute import SimpleImputer imp = SimpleImputer() 

рдЙрд╕реА рд╕рдордп, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ (рдЪрд╛рд╣реЗ рд╣рдо рдзреЛрдЦрд╛рдзрдбрд╝реА рдХреЗ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдкрд░ рд╕рдВрджреЗрд╣ рдХрд░реЗрдВ):


 target = source_df[target_field] email_data = source_df[email_features] email_data = pd.concat([email_data, target], axis=1) email_data_poi = email_data[email_data[target_field]][email_features] email_data_nonpoi = email_data[email_data[target_field] == False][email_features] email_data_poi[email_features] = imp.fit_transform(email_data_poi) email_data_nonpoi[email_features] = imp.fit_transform(email_data_nonpoi) email_data = email_data_poi.append(email_data_nonpoi) 

рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж рдЕрдВрддрд┐рдо рдбреЗрдЯрд╛рд╕реЗрдЯ:


 df = payments.join(stocks) df = df.join(email_data) df = df.astype(float) 

рдЙрддреНрд╕рд░реНрдЬрди


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


 first_quartile = df.quantile(q=0.25) third_quartile = df.quantile(q=0.75) IQR = third_quartile - first_quartile outliers = df[(df > (third_quartile + 1.5 * IQR)) | (df < (first_quartile - 1.5 * IQR))].count(axis=1) outliers.sort_values(axis=0, ascending=False, inplace=True) outliers = outliers.head(10) outliers 

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


 target_for_outliers = target.loc[outliers.index] outliers = pd.concat([outliers, target_for_outliers], axis=1) non_poi_outliers = outliers[np.logical_not(outliers.poi)] df.drop(non_poi_outliers.index, inplace=True) 

рдЕрдВрддрд┐рдо рдорди рдореЗрдВ рд▓рд╛рдирд╛


рд╣рдо рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ:


 from sklearn.preprocessing import scale df[df.columns] = scale(df) 

рд▓рдХреНрд╖реНрдп рдЪрд░ рдХреЛ рд╕рдВрдЧрдд рджреГрд╢реНрдп рдкрд░ рд▓рдХреНрд╖рд┐рдд рдХрд░реЗрдВ:


 target.drop(non_poi_outliers.index, inplace=True) target = target.map({True: 1, False: 0}) target.value_counts() 

рдЫрд╡рд┐
рдирддреАрдЬрддрди, 18 рд╕рдВрджрд┐рдЧреНрдз рдФрд░ 121 рдЬреЛ рд╕рдВрджреЗрд╣ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЖрдПред


рдлрд╝реАрдЪрд░ рдЪрдпрди


рдХрд┐рд╕реА рднреА рдореЙрдбрд▓ рдХреЛ рд╕реАрдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБрдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЪрдпрди рд╣реИред


рдорд▓реНрдЯреАрдХреЛрд▓рд┐рдирд░рд┐рдЯреА рдЯреЗрд╕реНрдЯ


 import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline sns.set(style="whitegrid") corr = df.corr() * 100 # Select upper triangle of correlation matrix mask = np.zeros_like(corr, dtype=np.bool) mask[np.triu_indices_from(mask)] = True # Set up the matplotlib figure f, ax = plt.subplots(figsize=(15, 11)) # Generate a custom diverging colormap cmap = sns.diverging_palette(220, 10) # Draw the heatmap with the mask and correct aspect ratio sns.heatmap(corr, mask=mask, cmap=cmap, center=0, linewidths=1, cbar_kws={"shrink": .7}, annot=True, fmt=".2f") 

рдЫрд╡рд┐
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЫрд╡рд┐ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░рд╛ 'рд▓реЛрди_рдПрдбрд╡рд╛рдВрд╕' рдФрд░ 'рдЯреЛрдЯрд▓_рдкреЗрдореЗрдВрдЯреНрд╕' рдХреЗ рд╕рд╛рде-рд╕рд╛рде 'рдЯреЛрдЯрд▓_рд╕реНрдЯреЙрдХ_рд╡рд▓реНрдпреВ' рдФрд░ 'рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд_рд╕реНрдЯреЙрдХ' рдХреЗ рдмреАрдЪ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдмрдВрдз рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, 'Total_payments' рдФрд░ 'total_stock_value' рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рдореВрд╣ рдХреЗ рд╕рднреА рд╕рдВрдХреЗрддрдХреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


 df.drop(columns=['total_payments', 'total_stock_value'], inplace=True) 

рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


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


 df['ratio_of_poi_mail'] = df['from_poi_to_this_person']/df['to_messages'] df['ratio_of_mail_to_poi'] = df['from_this_person_to_poi']/df['from_messages'] 

рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрдХреЗрддреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛


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


 from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(df, target, test_size=0.2, random_state=42) 

 from sklearn.feature_selection import RFECV from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier(random_state=42) rfecv = RFECV(estimator=forest, cv=5, scoring='accuracy') rfecv = rfecv.fit(X_train, y_train) plt.figure() plt.xlabel("Number of features selected") plt.ylabel("Cross validation score of number of selected features") plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_, '--o') indices = rfecv.get_support() columns = X_train.columns[indices] print('The most important columns are {}'.format(','.join(columns))) 

рдЫрд╡рд┐
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, RandomForestClassifier рдиреЗ рдЧрдгрдирд╛ рдХреА рдХрд┐ 18 рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ 7 рд╣реА рдорд╛рдпрдиреЗ рд░рдЦрддреА рд╣реИред рдмрд╛рдХреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдореЙрдбрд▓ рдХреА рд╕рдЯреАрдХрддрд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред


 The most important columns are bonus, deferred_income, other, exercised_stock_options, shared_receipt_with_poi, ratio_of_poi_mail, ratio_of_mail_to_poi 

рдЗрди 7 рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдореЙрдбрд▓ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдкреБрдирдГ рдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:


  • рдмреЛрдирд╕
  • deferred_income
  • рдЕрдиреНрдп
  • exercised_stock_options
  • shared_receipt_with_poi
  • ratio_of_poi_mail
  • ratio_of_mail_to_poi

рднрд╡рд┐рд╖реНрдп рдХреЗ рдореЙрдбрд▓ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрджрд▓реЗрдВ:


 X_train = X_train[columns] X_test = X_test[columns] 

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


рджреВрд╕рд░рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рд╣реИ

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


All Articles