from sklearn.feature_selection import f_regression from sklearn.linear_model import LinearRegression, Lasso, LassoCV from sklearn.preprocessing import MinMaxScaler import numpy as np from tabulate import tabulate #генерируем исходные данные: 750 строк-наблюдений и 14 столбцов-признаков np.random.seed(1) size = 750 X = np.random.uniform(0, 1, (size, 14)) #Задаем функцию-выход: регрессионную проблему Фридмана Y = (10 * np.sin(np.pi*X[:,0]*X[:,1]) + 20*(X[:,2] - .5)**2 + 10*X[:,3] + 5*X[:,4]**5 + np.random.normal(0,1)) #Добавляем зависимость признаков X[:,10:] = X[:,:4] + np.random.normal(0, .025, (size,4)) #линейная модель lr = LinearRegression() lr.fit(X, Y) #Лассо lasso = LassoCV() lasso.fit(X, Y) #f_regression f, pval = f_regression(X, Y, center=True) def ranks_minmax(ranks): ranks = np.abs(ranks) minmax = MinMaxScaler() ranks = minmax.fit_transform(np.array(ranks).reshape(14,1)).ravel() return np.round(ranks, 2) names = ["x%s" % i for i in range(1,15)] lrCoef = ranks_minmax(lr.coef_) lassoCoef = ranks_minmax(lasso.coef_) fCoef = ranks_minmax(f) mean = [] for i in range(len(lrCoef)): mean.append(round((lrCoef[i] + lassoCoef[i] + fCoef[i]) / 3, 2)) firstRow = np.append(['Линейная регрессия'], lrCoef) secondRow = np.append(['Лассо'], lassoCoef) thirdRow = np.append(['Линейная корреляция'], fCoef) fourthRow = np.append(['Среднее'], mean) names = np.append(['Тип'], names) print(tabulate([firstRow, secondRow, thirdRow, fourthRow], headers=names)) print() print("Индексы максимальных значений") print() names = np.append(["Место по важности"], ["%s" % i for i in range(1,15)]) firstRow = np.append(['Линейная регрессия'], [1] + np.argsort(lrCoef)[::-1]) secondRow = np.append(['Лассо'], [1] + np.argsort(lassoCoef)[::-1]) thirdRow = np.append(['Линейная корреляция'], [1] + np.argsort(fCoef)[::-1]) fourthRow = np.append(['Среднее'], [1] + np.argsort(mean)[::-1]) print(tabulate([firstRow, secondRow, thirdRow, fourthRow], headers=names))