Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.08 KB | None | 0 0
  1. import os.path
  2. from collections import Counter
  3. import numpy as np
  4. import scipy as sp
  5. import pandas as pd
  6.  
  7. import csv
  8.  
  9. #[L, R] - границы дисперсии, только факторы с такой дисперсией будем рассматривать
  10. from sklearn.ensemble import AdaBoostClassifier
  11.  
  12. L = 0.5
  13. R = 10
  14. #pos - индексы факторов (столбцов), дисперсия которых не лежит в [L, R]
  15. pos = [0, 1, 2, 4, 8, 13, 21, 22, 23, 27, 28]
  16.  
  17. class StandardScaler:
  18.     def __init__(self):
  19.         self.mean = []
  20.         self.var = []
  21.  
  22.     def fit(self, X):
  23.         for j in range(len(X[0])):
  24.             #среднее значение
  25.             sum = 0.0
  26.             for i in range(len(X)):
  27.                 sum += X[i][j]
  28.             self.mean.append(sum / len(X))
  29.             #дисперсия
  30.             sum = 0.0
  31.             for i in range(len(X)):
  32.                 sum += (X[i][j] - self.mean[j]) * (X[i][j] - self.mean[j])
  33.             sum /= (len(X) - 1)
  34.             self.var.append(sp.sqrt(sum))
  35.         #print(self.var)
  36.         delete_features(X, self.var)
  37.         return self
  38.  
  39.     def transform(self, X):
  40.         for i in range(len(X)):
  41.             for j in range(len(X[i])):
  42.                 X[i][j] = (X[i][j] - self.mean[j]) / self.var[j]
  43.         return X
  44.  
  45. #Так как большой разброс и очень мало данных,
  46. #значит влияние фактора c большой (или маленькой) дисперсией только ухудшает точность -
  47. #удалим такие факторы
  48. def delete_features(X, var):
  49.     ind = []
  50.     for i in range(len(var)):
  51.         if not (L < var[i] < R):
  52.             ind.append(i)
  53.     #print(ind)
  54.     return np.delete(X, ind, 1)
  55.  
  56.  
  57. class MinMaxScaler:
  58.     def __init__(self):
  59.         self.data_min = []
  60.         self.data_max = []
  61.  
  62.     def fit(self, X):
  63.         for j in range(len(X[0])):
  64.             self.data_min.append(X[:,j].min())
  65.             self.data_max.append(X[:, j].max())
  66.  
  67.     def transform(self, X):
  68.         for i in range(len(X)):
  69.             #print(i)
  70.             for j in range(len(X[i])):
  71.                 X[i][j] = (X[i][j] - self.data_min[j]) /\
  72.                           (self.data_max[j] - self.data_min[j])
  73.         return X
  74.  
  75.  
  76. def cross_features(X):
  77.     n = len(X[0])
  78.     A = np.zeros(len(X), [])
  79.     for i in range(len(X)):
  80.         for j in range(n):
  81.             for k in range(j, n):
  82.                 A[i].append(X[i][j] * X[i][k])
  83.     return A
  84.  
  85.  
  86. class LinearRegression:
  87.     def __init__(self):
  88.         self.beta = None
  89.         self.beta0 = None
  90.  
  91.     def fit(self, X, y):
  92.         sum = y.sum()
  93.         self.beta0 = sum / len(y)
  94.         T = X.transpose()
  95.         #TX = np.dot(T, X)
  96.         TX = np.matmul(T,X)
  97.         ITX = np.linalg.inv(TX)
  98.         ITXT = np.matmul(ITX, T)
  99.         self.beta = np.matmul(ITXT, np.transpose(y))
  100.         return self
  101.  
  102.     def predict(self, X):
  103.         p = self.beta
  104.         res = [0] * len(X)
  105.         for k in range(len(res)):
  106.             for i in range(len(p)):
  107.                 res[k] += p[i] * X[k][i]
  108.             #будем использовать beta0, как свободный член
  109.             res[k] += self.beta0
  110.         return res
  111.  
  112.  
  113. def rmse(y_true, y_pred):
  114.     sum = 0.0
  115.     for i in range(len(y_true)):
  116.         sum += (y_pred[i] - y_true[i]) * (y_pred[i] - y_true[i])
  117.     return sp.sqrt(sum/len(y_true))
  118.  
  119.  
  120. def learn_test_split(X, y):
  121.     XL = []
  122.     XT = []
  123.     yL = []
  124.     yT = []
  125.     for i in range(len(X)):
  126.         a = np.random.randint(0, 1)
  127.         if a == 0 and len(XL) < len(X) / 2:
  128.             XL.append(X[i])
  129.             yL.append(y[i])
  130.         else:
  131.             XT.append(X[i])
  132.             yT.append(y[i])
  133.     X_learn = np.asarray(XL)
  134.     X_test = np.asarray(XT)
  135.     y_learn = np.asarray(yL)
  136.     y_test = np.asarray(yT)
  137.     return X_learn, X_test, y_learn, y_test
  138.  
  139.  
  140. def cv_linear_regression(X, y, *, n_iter=1000):
  141.     a = LinearRegression()
  142.     sum_rmse = 0.0
  143.     for i in range(n_iter):
  144.         X_learn, X_test, y_learn, y_test = learn_test_split(X, y)
  145.         a.fit(X_learn, y_learn)
  146.         y_pred = a.predict(X_test)
  147.         sum_rmse += rmse(y_test, y_pred)
  148.     return sum_rmse / n_iter
  149.  
  150. def feature_importance(X, Y, feature_names):
  151.     adabBoost = AdaBoostClassifier(random_state=42, n_estimators=100)
  152.     adabBoost.fit(X, Y)
  153.     importances = adabBoost.feature_importances_
  154.  
  155.     indices = np.argsort(importances)[::-1]
  156.  
  157.     # Print the feature ranking
  158.     print("Feature ranking:")
  159.  
  160.     for f in range(X.shape[1]):
  161.         print("%d. feature %s (%f)" % (f + 1, feature_names[indices[f]], importances[indices[f]]))
  162.  
  163. class Pipeline:
  164.     def __init__(self):
  165.         #self.scaler = MinMaxScaler()
  166.         self.scaler = StandardScaler()
  167.         self.LR = LinearRegression()
  168.  
  169.     def fit(self, X, y):
  170.         self.scaler = self.scaler.fit(X)
  171.         X = self.scaler.transform(X)
  172.         self.LR = self.LR.fit(X, y)
  173.         return self
  174.  
  175.     def predict(self, X):
  176.         X = self.scaler.transform(X)
  177.         y = self.LR.predict(X)
  178.         return y
  179.  
  180.  
  181. class CatEncoder:
  182.     def __init__(self):
  183.         self.feature_values = [[]]
  184.         self.rows = []
  185.  
  186.     def fit(self, X):
  187.         l = 0
  188.         for j in range(len(X[0])):
  189.             if type(X[0][j]) == str:
  190.                 self.rows.append(j)
  191.                 self.feature_values.append([])
  192.                 for i in range(len(X)):
  193.                     self.feature_values[l].append((X[i][j], i))
  194.                 self.feature_values[l].sort()
  195.                 l += 1
  196.         return self
  197.  
  198.     def transform(self, X):
  199.         for k, j in enumerate(self.rows):
  200.             for i, cur in enumerate(self.feature_values[k]):
  201.                 X[cur[1]][j] = i
  202.         return X
  203.  
  204. def clean_data(X):
  205.     # X = np.delete(X, del_columns, 1)
  206.     for j in range(len(X[0])):
  207.         cnt = Counter()
  208.         empty = []
  209.         for i in range(len(X)):
  210.             if str(X[i][j]) != 'nan':
  211.                 cnt[X[i][j]] += 1
  212.             else:
  213.                 empty.append(i)
  214.         for i, v in enumerate(empty):
  215.             X[v][j] = cnt.most_common(1)[0][0]
  216.     return X
  217.  
  218. def into(X):
  219.     X = clean_data(X)
  220.     CE = CatEncoder().fit(X)
  221.     X = CE.transform(X)
  222.     X = X.astype('float64')
  223.     return X
  224.  
  225. def main():
  226.     df_learn = pd.read_csv("learn.csv")
  227.     X_learn = df_learn.ix[:, :-1].as_matrix()
  228.     X_learn = into(X_learn)
  229.     y_learn = df_learn.ix[:, -1].as_matrix()
  230.     # X = np.delete(X, pos, 1)
  231.     rmse = cv_linear_regression(X_learn, y_learn)
  232.     Pl = Pipeline().fit(X_learn, y_learn)
  233.  
  234.     df_test = pd.read_csv("test.csv")
  235.     #X_test = pd.get_dummies(df_test.ix[:, 1:],columns=cat_columns).as_matrix()
  236.     X_test = df_test.ix[:, 1:].as_matrix()
  237.     X_test = into(X_test)
  238.     y_pred = Pl.predict(X_test)
  239.     solution_name, _ext = os.path.splitext(os.path.basename(__file__))
  240.     pd.DataFrame({"y": y_pred, "id": df_test["id"]}) \
  241.         .to_csv(solution_name + ".csv", index=False, header=True)
  242.     print("rmse:", rmse)
  243.  
  244. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement