Sklearn классификация с DecisionTree, как улучшить посадку? - PullRequest
0 голосов
/ 09 апреля 2020

это первый раз, когда я подхожу к анализу данных, и я пытаюсь выполнить задачу классификации. Я пытаюсь предсказать цену автомобиля. У меня есть следующий DataFrame (уже очищенный):

price   vehicleType yearOfRegistration  gearbox powerPS model   kilometer   fuelType    brand   notRepairedDamage
2   9000    suv 2004    automatik   163 grand   125000  diesel  jeep    not-declared
3   1500    kleinwagen  2001    manuell 75  golf    150000  benzin  volkswagen  nein
4   3000    kleinwagen  2008    manuell 69  fabia   90000   diesel  skoda   nein
6   1500    cabrio  2004    manuell 109 2_reihe 150000  benzin  peugeot nein
8   12500   bus 2014    manuell 125 c_max   30000   benzin  ford    not-declared
... ... ... ... ... ... ... ... ... ... ...
371520  3000    limousine   2004    manuell 225 leon    150000  benzin  seat    ja
371524  1000    cabrio  2000    automatik   101 fortwo  125000  benzin  smart   nein
371525  9000    bus 1996    manuell 102 transporter 150000  diesel  volkswagen  nein
371526  3000    kombi   2002    manuell 100 golf    150000  diesel  volkswagen  not-declared
371527  25000   limousine   2013    manuell 320 m_reihe 50000   benzin  bmw nein

Итак, как вы можете видеть, есть категориальные атрибуты. Поэтому я должен их кодировать. Я сделал это следующим образом:

encoding = DataFrameMapper([
    (['vehicleType', 'gearbox', 'model', 'fuelType', 'brand', 'notRepairedDamage'], 
      OneHotEncoder(handle_unknown='ignore')),    
    (["yearOfRegistration", "powerPS", "kilometer"], OneHotEncoder(handle_unknown='ignore'))
    ])

encoding_target = DataFrameMapper([
    (['price'], None)
])

Здесь я должен упомянуть, что у меня был столбец с названием «Имена» с именем и опционально для автомобиля. Мне пришлось отбросить это, поскольку в фрейме данных содержится 250 тыс. Строк, и если я пытаюсь кодировать этот столбец, я получаю ошибку памяти.

Затем я приступил к подгонке и преобразованию:

encoding.fit(data)
encoding_target.fit(data)

X = encoding.transform(data.loc[:, data.columns != "price"])
y = encoding_target.transform(data[['price']])

Затем я создал разделив поезд / тест

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .2, random_state = 0)

, а затем просто вызвал конструктор дерева решений как:

tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
y_pred = tree.predict(X_test)
accuracy_score(y_test, y_pred)

Я получил оценку 0,38. Который действительно низкий. Итак, я хотел бы спросить вас, заключается ли проблема в том, как я кодирую фрейм данных для использования его со sklearn. Да, есть ли лучший способ? Таким образом, у меня также возникают проблемы с перекрестной проверкой, и я не чувствую, что фрейм данных полностью пригоден для использования с другими алгоритмами. Спасибо:)

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Если вы прогнозируете цену автомобиля, целевой ценностью будет price, поэтому обычно это проблема регрессии, а не классификации. Классификационная модель понятия не имеет, что 1000 ближе к 1500, чем 25000 - она ​​просто рассматривает их как отдельные классы. Ваша модель имеет точность 0,38 при прогнозировании класса цены.

Вместо этого попробуйте DecisionTreeRegressor(). Вы можете посмотреть на некоторые из этих метрик: https://scikit-learn.org/stable/modules/model_evaluation.html#regression -метрики

1 голос
/ 09 апреля 2020

Я не уверен, что это вопрос Stackoverflow, а не stackexchange или наука, так как это не связано с программированием. Но вот несколько советов:

  1. Вам не нужно кодировать переменную y, большинство sklearn преобразует ее в числа. Если нет, просто сделайте набор для сопоставления (если они категоричны).
  2. Для алгоритма будет довольно невозможно получить большое число в качестве прогноза. Попробуйте преобразовать переменную y во что-то другое. (т.е.: выше или ниже, чем 10k или% увеличения после X периодов).
  3. Если ваша y-категориальная переменная имеет более 2 опций, установите аргумент "stratify = y" на train_test_split)

Кстати, ваша низкая точность в основном пуля 2 .

edit: Только что видел, как вы хвалили, что ваш y делится между 12 интервалами. Таким образом, вы должны сделать смесь всех советов. Создайте новую переменную y, которая будет выглядеть примерно так: if price between 0 and 1k then 0, elif between 1k and 3k then 1 (and so on..), возможно, с использованием .lo c (). Panda.

...