Праздник закончился, ваше состояние вернулось? Итак, опустошив голову, давайте сначала научимся, приветствуем всех, чтобы и дальше обращать вниманиеСообщество облачных технологий Tencent.
автор:Чжао Чэнлун
Это трудная статья для написания, потому что я надеюсь, что эта статья будет полезна для всех вас. Я не буду знакомить вас с отраслевым фоном машинного обучения и интеллектуального анализа данных, а также не буду конкретно представлять теоретическую основу и математический вывод алгоритмов обучения, таких как логистическая регрессия, SVM, GBDT, нейронная сеть и т. д. Эта статья больше поможет вам в этом. Краткий учебник по машинному обучению и моделированию данных.
Эта статья в основном разделена на четыре части (ограничено по времени, она будет разделена на две части):
Предыдущий:
- Глава подготовки в основном включает в себя создание среды и базовые знания о пандах.
- В главе о приложении я возьму в качестве примера Titanic на kaggle, начиная с получения источника данных, очистки данных, обработки признаков, выбора модели, вывода модели и приложения.
Следующий:
- Глава об оптимизации знакомит с несколькими методами оптимизации.
- Думая над статьей, выдвинул несколько беспокоящих меня проблем, надеюсь на помощь каждого.
Подготовка
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