Выбор оценщика SciKitLearn

#python-3.x #numpy #scikit-learn

#python-3.x #numpy #scikit-учиться

Вопрос:

Добрый день,

Будучи скромным новичком, работающим над проектом машинного обучения, я опробовал самый простой оценщик (линейную регрессию), хотя я почти уверен, что сделал неправильный выбор, основываясь на своих данных. В моих данных у меня есть 38 столбцов, в которых есть столбец datetime, два столбца string, и мои три цели: два столбца типа int и столбец типа string (одиночный символ), в то время как другие столбцы состоят из чисел с плавающей точкой. Использование линейной регрессии (после удаления столбцов datetime, преобразования каждого строкового типа в числовой) Я получаю максимальную точность 44% (0,44) от моей модели после 10000 итераций с циклом for.

Вот мой код.

 import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import pickle

#Import xls#
data_18_19 = pd.read_excel(r'c:UsersunknoDesktopxxxxx_x_.xls')
data_19_20 = pd.read_excel(r'c:UsersunknoDesktopyyyyy_y_.xls')

#fusione dfs#
merge_data = [data_18_19, data_19_20]
data = pd.concat(merge_data, sort=False)


#Drop della colonna Div, tutte l1 e orario perché problematico#
data = data.drop(['Div'], 1)
data = data.drop(['Time'], 1)
data = data.drop(['Date'], 1)

#droplist str list comprehension dei nomi delle colonne#
droplist = [str(x) for x in data.iloc[0:0,37:]]
data = data.drop(droplist, 1)

#Cambio di HT, D, AT in 1,0,2 per HTR e FTR#
data['FTR'] = data['FTR'].replace(['H','D','A'], [1,0,2])
data['HTR'] = data['HTR'].replace(['H','D','A'], [1,0,2])

#Trasformazione s in numeri in ordine alfabetico#
dt = {'At':1,'Bo':2,'Br':3,'Ca':4,'Ch':23,'Em':22,'Fr':21,'Fi':5,'Ge':6,'In':7,'Ju':8,'La':9,'Le':10,'Mi':11,'Na':12,'Pa':13,'Ro':14,'Sa':15,'Sas':16,'Sp':17,'To':18,'Ud':19,'Ve':20}
data['HT'] = data['HT'].replace([i for i in dt.keys()], [j for j in dt.values()])
data['AT'] = data['AT'].replace([i for i in dt.keys()], [j for j in dt.values()])

#definizione della colonna target della predizione#
predict = 'FTR'

#Costituzione delle features(X) e dei target(y)#
X = np.array(data.drop([predict],axis=1))
y = np.array(data[predict])

best = 0
for i in range(10000):
    #split dei dati per validazione#
    X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.1)
    
    #definizione e training del modello da training#
    model = LinearRegression()
    model.fit(X_train, y_train)
    
    #test di precisione#
    acc = model.score(X_test, y_test)
    
    #predizioni#
    predicts = model.predict(X_test)
    hr_predicts = np.around(predicts)
    
    if acc > best:
        best = acc
        with open(r"c:UsersunknoDesktopdump.pickle", "wb") as doc:
            pickle.dump(model, doc)
            
    print("Precisione: ", acc)
  

Я размышлял о том, как повысить точность и какой оценщик выбрать для получения лучших результатов?
Заранее благодарю.

Комментарии:

1. Нет данных, нет ответа для других. Очень общее описание вашей проблемы.

2. Существует ли одна независимая переменная? Для этого подойдет линейная регрессия. Еще? Попробуйте многомерную регрессию или случайный лес. Вы также можете использовать K-кратную перекрестную проверку для тестирования нескольких гиперпараметров. Вы также могли бы использовать машину опорных векторов и попробовать с этим. Случайный регрессор леса, вероятно, даст вам наибольшую отдачу от ваших денег.

3. @Chrispr Вы имеете в виду параметры, имеющие большое значение для гиперпараметров?

Ответ №1:

Существует несколько подходов. Тем не менее, несколько простых шагов без особых изменений, которые были сделаны.

  1. Проверьте производительность модели после масштабирования данных. Если масштаб предикторов сильно отличается, то модель не сходится должным образом. Я предполагаю, что y, который вы хотите предсказать, также является непрерывной переменной. Проверьте, соответствует ли он нормальному распределению. Кроме того, применение преобразования журнала помогает нормализовать.

  2. Во-вторых, random_state не указан в train_test_split. Это намеренно? Пожалуйста, проверьте производительность, установив для нее случайное значение int.

 from sklearn.preprocessing import StandardScaler
scalar = StandardScaler()
X_train = scalar.fit_transform(X_train)
y_train = scalar.fit_transform(y_train)

# only transform the test data , else it leads to data leakage 
X_test = scalar.transform(X_test)
y_train = scalar.transform(y_test)