5 минут, чтобы научить вас играть в машинное обучение sklearn (включено)

машинное обучение искусственный интеллект pandas модульный тест

Праздник закончился, ваше состояние вернулось? Итак, опустошив голову, давайте сначала научимся, приветствуем всех, чтобы и дальше обращать вниманиеСообщество облачных технологий Tencent.

автор:Чжао Чэнлун

Это трудная статья для написания, потому что я надеюсь, что эта статья будет полезна для всех вас. Я не буду знакомить вас с отраслевым фоном машинного обучения и интеллектуального анализа данных, а также не буду конкретно представлять теоретическую основу и математический вывод алгоритмов обучения, таких как логистическая регрессия, SVM, GBDT, нейронная сеть и т. д. Эта статья больше поможет вам в этом. Краткий учебник по машинному обучению и моделированию данных.

Эта статья в основном разделена на четыре части (ограничено по времени, она будет разделена на две части):

Предыдущий:

  1. Глава подготовки в основном включает в себя создание среды и базовые знания о пандах.
  2. В главе о приложении я возьму в качестве примера Titanic на kaggle, начиная с получения источника данных, очистки данных, обработки признаков, выбора модели, вывода модели и приложения.

Следующий:

  1. Глава об оптимизации знакомит с несколькими методами оптимизации.
  2. Думая над статьей, выдвинул несколько беспокоящих меня проблем, надеюсь на помощь каждого.

Подготовка

1 Окружающая среда

Экспериментальная среда всего sklearn: python 2.7 + pycharm + Anaconda.

2 основы панды

Здесь мы можем только представить знания панд, которые будут использоваться ниже, а те, кому интересно, могут перейти к конкретному обучению. Всем рекомендую справочник: "Python для анализа данных". Если у вас есть основы, вы можете сразу перейти к главе о приложении.

Pandas в основном использует две структуры данных: Series и DataFrame. Series похож на одномерный массив, а DataFrame больше похож на структуру двумерной таблицы.

Конструктор серии:

label=[1,0,1,0,1]
data = pd.Series(data=label,index=['a','b','c','d','e'],dtype=int,name="label")
print data

Серия берет данные и берет индекс за индексом

data['a']
data[['a','b']]

Построение DataFrame

(1) Построить в виде словаря

frame = pd.DataFrame({'name':['Time','Jack','Lily'],'Age':[20,30,12],"weight":[56.7,64.0,50.0]})

(2) Построить DataFrame из DataFrame

frame1 = pd.DataFrame(frame,columns=["name","Age"])

Два столбца считываются из фрейма для формирования нового фрейма данных.

Операции с кадрами данных

1 Добавить столбец

frame1["friends_num"]=[10,12,14]

2 удалить столбцы

frame2 = frame1.drop(["name","Age"],axis=1)

3 Найдите строки данных

frame1[frame1["friends_num"]>10]

Результат выглядит следующим образом:

Статистические методы для DataFrame

1 apply взаимодействует с лямбда-выражением для обработки столбцов, например сегментации столбца Age кадра1.

 frame1["Age_group"] = frame1["Age"].apply(lambda x: 0 if x < 20 else 1)

2 описывают выходную статистику, очень мощный

frame1.describe()

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

frame1.describe(include=['O'])

3 Обработка пропущенных значений
pandas обычно заполняет NAN отсутствующими значениями.

#以0填充缺失值
frame1.fillna(0)
#丢掉任何包含NAN的行 
frame1.dropna()
#删除全为nan的行
frame1.dropna(how="all")

Два приложения

1 чтение данных

В этом примере в качестве источника данных используется Титаник. Данные вы можете получить во вложении.

data = pd.DataFrame(pd.read_csv(train_path))
data_test = pd.DataFrame(pd.read_csv(test_path))
data_test = data_test[["Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"]]
x = data[["Pclass","Name","Sex","Age","SibSp","Parch","Ticket","Fare","Cabin","Embarked"]]
y = data[["Survived"]]
print x.describe()
print x.describe(include=['O'])
print data_test.describe()
print data_test.describe(include=['O'])

Исходная статистика данных:

2 Очистка данных

1 Обработка пропущенных значений.
В столбцах Age и Embarked имеется небольшое количество отсутствующих значений, которые обрабатываются отдельно.

#用众数填充缺失值
data_set["Embarked"]=data_set["Embarked"].fillna('S')
#用均值填充Age缺失值
data_set["Age"]=data_set["Age"].fillna(data_set["Age"].mean())

2 Удалить столбец с большой пропущенной ставкой (при начальной обработке)
Отсутствующий уровень столбца Cabin достиг 75%, и столбец был удален и изменен.

data_set = data_set.drop([ "Cabin"], axis=1)

3 Обработка функций

Обработка признаков основана на конкретных данных, поэтому необходимо полностью понять данные перед обработкой признаков. Не существует фиксированного метода обработки признаков, он в основном опирается на личный опыт и наблюдения, и ожидается, что благодаря непрерывным попыткам и преобразованиям можно будет найти лучшие переменные признаков. Поэтому обработка признаков является наиболее трудоемкой и трудоемкой работой в процессе построения модели.

1) Извлечение одномерных признаков.

#根据name的长度,抽象出name_len特征 
data_set["name_len"] = data_set["Name"].apply(len)

Обратите внимание на столбец имени

Наблюдая за данными столбца «Имя», вы можете найти информацию о титуле с указанием пола и брака в имени. Извлеките эту информацию (потенциально полезные функции).

data_set["name_class"] = data_set["Name"].apply(lambda x : x.split(",")[1]).apply(lambda x :x.split()[0])

2) Комбинация нескольких переменных
sibsp представляет количество братьев и сестер и супругов
parch представляет количество родителей и детей
Таким образом, вы можете объединить sibsp и parch, чтобы получить количество членов семьи.

data_set["family_num"] = data_set["Parch"] + data_set["SibSp"] +1

3) Номинальная переменная в числовую переменную

#Embarked
data_set["Embarked"]=data_set["Embarked"].map({'S':1,'C':2,'Q':3}).astype(int)
#Sex
data_set["Sex"] = data_set["Sex"].apply(lambda x : 0 if x=='male' else 1)

4) Сегментация данных

Сегментация на основе статистики и опыта

#[7.91,14.45,31.0]根据Fare的统计信息进行分段
data_set["Fare"] = data_set["Fare"].apply(lambda x:cutFeature([7.91,14.45,31.0],x))
#[18,48,64]按照经验分段
data_set["Age"] = data_set["Age"].apply(lambda x:cutFeature([18,48,64],x))

После простой обработки данных мы получаем следующие 12-мерные данные:

4 Выбор модели и тестирование

Предварительный отбор 5 моделей для тестирования

RandomForestClassifier

ExtraTreesClassifier

AdaBoostClassifier

GradientBoostingClassifier

SVC

Параметры модели:

#随机森林
    rf_params = {
        'n_jobs': -1,
        'n_estimators': 500,
        'warm_start': True,
        # 'max_features': 0.2,
        'max_depth': 6,
        'min_samples_leaf': 2,
        'max_features': 'sqrt',
        'verbose': 0
    }
    # Extra Trees 随机森林
    et_params = {
        'n_jobs': -1,
        'n_estimators': 500,
        # 'max_features': 0.5,
        'max_depth': 8,
        'min_samples_leaf': 2,
        'verbose': 0
    }

    # AdaBoost 
    ada_params = {
        'n_estimators': 500,
        'learning_rate': 0.75
    }

    # GBDT
    gb_params = {
        'n_estimators': 500,
        # 'max_features': 0.2,
        'max_depth': 5,
        'min_samples_leaf': 2,
        'verbose': 0
    }

    # SVC
    svc_params = {
        'kernel': 'linear',
        'C': 0.025
    }

Код выбора модели:

classifiers = [
        ("rf_model", RandomForestClassifier(**rf_params)),
        ("et_model", ExtraTreesClassifier(**et_params)),
        ("ada_model", AdaBoostClassifier(**ada_params)),
        ("gb_model", GradientBoostingClassifier(**gb_params)),
        ("svc_model", SVC(**svc_params)),
    ]

    heldout = [0.95, 0.90, 0.75, 0.50, 0.01]
    rounds = 20
    xx = 1. - np.array(heldout)
    for name, clf in classifiers:
        print("training %s" % name)
        rng = np.random.RandomState(42)
        yy = []
        for i in heldout:
            yy_ = []
            for r in range(rounds):
                X_train_turn, X_test_turn, y_train_turn, y_test_turn = \
                    train_test_split(x_train, labels_train, test_size=i, random_state=rng)
                clf.fit(X_train_turn, y_train_turn)
                y_pred = clf.predict(X_test_turn)
                yy_.append(1 - np.mean(y_pred == y_test_turn))
            yy.append(np.mean(yy_))
        plt.plot(xx, yy, label=name)

    plt.legend(loc="upper right")
    plt.xlabel("Proportion train")
    plt.ylabel("Test Error Rate")
    plt.show()

Результаты отбора следующие:

Как видно из рисунка выше, randomForest в целом превосходит другие алгоритмы. Предварительный выбор алгоритма randomforest.
Производительность модели на тренировочном наборе:

def modelScore(x_train,labels_train,x_test,y_test,model_name,et_params):
    print("--------%s------------")%(model_name)
    model = model_name(**et_params)

    model.fit(x_train, labels_train)
    if "feature_importances_" in dir(model):
        print model.feature_importances_

    print classification_report(
        labels_train,
        model.predict(x_train))

    print classification_report(
        y_test,
        model.predict(x_test))
    return model

modelScore(x_train, labels_train, x_test, y_test, RandomForestClassifier, rf_params)

Матрица путаницы обучающего набора выглядит следующим образом:

Матрица путаницы тестового набора выглядит следующим образом:

На этом этапе устанавливается предварительная модель обучения, а точность тестового набора составляет 83%. Из-за нехватки времени статьи об оптимизации и анализе будут опубликованы в следующей статье, так что следите за обновлениями.

Если у вас есть какие-либо ошибки или вопросы, пожалуйста, оставьте сообщение. Надеемся на рост и прогресс вместе со всеми вами!

Советы:Для получения информации о статье, пожалуйста,читать оригиналПолучать

Связанное Чтение

Машинное обучение: от новичка до первой модели

Сводные примечания к концепции машинного обучения (4)

Когда обучение с подкреплением встречается с функциональным анализом

Эта статья была разрешена автором для публикации в сообществе Tencent Cloud Technology Community, укажите это при перепечатке.Источник статьи
Исходная ссылка: https://cloud.tencent.com/community/article/229506