Можно ли сгруппировать университеты на государственные и частные, используя только их характеристики?

Привет всем! В этом проекте я хочу представить кластеризацию K-средних, один из наиболее распространенных алгоритмов кластеризации в машинном обучении. Попутно мы проведем исследовательский анализ данных, чтобы лучше понять набор данных об университетах.

Фон

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

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

Я проработал в сфере образования в Китае почти 4 года, и моя работа заключалась в использовании аналитики данных для оценки вероятности поступления студентов в университеты, указанные в списке школ, с учетом их профиля. Ради интереса я создам модель на Python, используя кластеризацию K-средних, чтобы объединить университеты в две группы: частные и государственные. На самом деле, студент, который проводит хотя бы беглое исследование на веб-сайте университета, может менее чем за минуту узнать, является ли школа частной или государственной, но мы посмотрим, сможет ли модель правильно классифицировать школы на основе функций, которые могут показаться очень актуальными. (обучение за пределами штата, количество выпускников) и другие, которые могут показаться неуместными (процент выпускников, которые жертвуют).

ПРИМЕЧАНИЕ: на самом деле у нас есть метки для этого набора данных, но мы НЕ будем использовать их для алгоритма кластеризации K-средних, поскольку это алгоритм обучения без учителя. В конце я сравню K-средних с алгоритмом контролируемого обучения, чтобы сравнить производительность двух моделей.

Данные

Вот особенности в этом наборе данных - не стесняйтесь взглянуть на них и подумать, насколько хорошо или плохо они могут предсказать, будет ли школа государственной или частной:

  • Приложения: количество полученных заявок.
  • Принять: количество принятых заявок.
  • Зачислить: количество зачисленных новых студентов.
  • Top10perc:% новых учащихся из 10% лучших учеников своего класса средней школы.
  • Top25perc:% новых учащихся из 25% лучших учеников своего класса средней школы.
  • F.Undergrad: количество студентов очных отделений.
  • P.Undergrad: количество студентов, обучающихся неполный рабочий день.
  • За пределами штата: обучение за пределами штата.
  • Room.Board: расходы на проживание и питание.
  • Книги: ориентировочная стоимость книг.
  • Личные: примерные личные расходы.
  • PhD:% профессорско-преподавательского состава с докторской степенью.
  • Терминал:% преподавателей с окончательной степенью (PhD / JD / MD / MBA и т. д.)
  • S.F.Ratio: соотношение студентов и преподавателей.
  • perc.alumni:% выпускников, которые жертвуют
  • Расходы: расходы на обучение в расчете на одного учащегося.
  • Grad.Rate: оценка окончания.

EDA = Исследовательский анализ данных

Хороший способ начать любой анализ - использовать Pandas.DataFrame.describe (), чтобы получить базовую статистику о ваших данных.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
colleges = pd.read_csv(‘College_Data’,index_col=0)
colleges.describe()

Если просто взглянуть на максимальное значение некоторых из этих столбцов, можно выделить несколько моментов:

  1. Общеизвестно, что лучшие частные школы могут взимать до 60 тысяч долларов в год, но максимальная плата за обучение за пределами штата здесь составляет всего 21 700 долларов, поэтому мы можем предположить, что это обучение указывается на семестровой основе. а не в год.
  2. Есть школа, где более 100% преподавателей имеют докторскую степень! Это кажется подозрительным, но, вероятно, это можно объяснить несколькими чрезмерно преуспевающими преподавателями, у которых может быть двойная докторская степень, которая была дважды засчитана.
  3. Точно так же у нас есть школа с показателем выпускников 118%! Мы исследуем эту аномалию позже ...

Не стесняйтесь просматривать средние, медианные и другие статистические данные, чтобы увидеть, что вам больше всего нравится! Вот что делает его исследовательским анализом данных.

Давайте выясним, в какой колледж поступило наибольшее количество абитуриентов.

colleges.loc[colleges[‘Apps’]==np.max(colleges[‘Apps’])]

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

colleges.loc[colleges[‘S.F.Ratio’]==np.min(colleges[‘S.F.Ratio’])]

Победителем здесь стал университет Чарльстона с очень низким коэффициентом 2,5, что практически так же близко к учебной среде, как домашнее обучение или частные уроки. Учитывая, что 25-й процентиль соотношения студентов и преподавателей составляет 11,5, U of C является серьезным отклонением.

А теперь поговорим о деньгах: в каком университете самый высокий уровень пожертвований от выпускников?

colleges.loc[colleges[‘perc.alumni’]==np.max(colleges[‘perc.alumni’])]

Неудивительно, что Уильямс получил приз, поскольку это небольшой гуманитарный колледж (всего около 2000 студентов), который обслуживает в основном богатые семьи с развитой сетью. Звонок .describe() ранее сообщил нам, что средний процент пожертвований составляет жалкие 21%, отсюда и множество возможностей трудоустройства на территории кампуса в качестве звонящих студентов.

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

colleges[‘expense ratio’] = colleges[‘Expend’]/(colleges[‘Outstate’])
colleges.describe()[‘expense ratio’]

ВОА! Тот факт, что среднее значение меньше 1, говорит мне о том, что средняя школа теряет деньги на своих учеников, если рассматривать обучение как единственный источник дохода. Фактически, ~ 69% университетов вкладывают в своих студентов больше денег, чем взимают, что не сулит ничего хорошего для будущего большинства университетов. Школа с самым высоким коэффициентом, вероятно, является школой Лиги плюща, верно?

colleges.loc[colleges[‘expense ratio’]==np.max(colleges[‘expense ratio’])]

НЕПРАВИЛЬНЫЙ! Лучшая награда «За свои деньги» достается… * барабанной дроби *… Университету Алабамы в Бирмингеме с коэффициентом расходов 3,68! Тем не менее, более циничный способ взглянуть на это: если UAB тратит почти в 4 раза больше обучения за пределами штата на каждого студента, тогда он может не работать в бизнесе намного дольше ... так что, если вы учитесь в классе HS 2021 года, получите пока они все еще на плаву, но держитесь крепче к своему кошельку, потому что те студенты, которые звонят, будут работать сверхурочно, чтобы забрать ваши пожертвования!

Для всех, кто задавался вопросом, самый крупный вор (колледж с самым низким показателем расходов) - это Линденвудский колледж с коэффициентом 0,378. Ура!

Визуализации

Пришло время создать визуализации данных!

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

plt.figure(figsize=(8,6))
sns.scatterplot(data=colleges,x='Outstate',y='F.Undergrad',hue='Private')

Хммм ... очень интересно, как количество студентов старшеклассников почти полностью не связано с оплатой за обучение, что вызывает вопрос: куда идут эти деньги? Давайте посмотрим на обучение за пределами штата и посмотрим на количество выпускников.

sns.set_style('darkgrid')
g = sns.FacetGrid(colleges,hue='Private',palette='coolwarm',height=6,aspect=1.5)
g = g.map(plt.hist,'Outstate',bins=20,alpha=0.7)
plt.legend(labels=['Private','Public'])

grid = sns.FacetGrid(colleges,hue='Private',palette='coolwarm',height=6,aspect=1.5)
grid = grid.map(plt.hist,'Grad.Rate',bins=20,alpha=0.7)
plt.legend(labels=['Private','Public'])

Как и ожидалось, плата за обучение за пределами штата выше для частных школ, как и процент выпускников - возможно, потому что, если учащийся вкладывает столько денег в свое образование, его родители думают: «Тебе лучше закончить ... иначе! »

А теперь вернемся к той школе, где процент выпускников выше 100% ... Оказывается, виноват колледж Казеновия. Может быть, в этой школе быстро закончили и засчитали двойные специальности как дважды получившие диплом? На самом деле в этом нет никакого смысла, поэтому я собираюсь изменить этот показатель на 100%.

А теперь перейдем к моменту, которого вы все ждали: кластеризация K-средних!

Создание кластера K-средних

Сначала мы импортируем KMeans из Scikit-learn, самого популярного пакета для машинного обучения на Python. K-means работает следующим образом:

  1. Выберите количество кластеров. Независимо от того, выберете ли вы 2, 4 или 10, это зависит от области конкретной проблемы. В данном случае мы разделяем школы на государственные и частные, поэтому мы выберем количество кластеров равным 2. Если вы анализировали генетические вариации в популяции и заранее знали, что существует 7 известных вариантов, то вы бы выбрали 7.
  2. Произвольно назначьте каждую точку данных категории.
  3. Возьмите центроид точек данных в каждой категории. Для тех из вас, кто думает, что центроид - это какой-то классно звучащий тип астероида, это многомерное исчисление, говоря «среднее всех данных в каждом кластере». Вы уже интуитивно понимаете это для одномерных данных: средняя цена продуктовых товаров дает вам одно число, например 52 доллара. Если вы подсчитаете среднюю цену и среднее количество продуктов (2 измерения), вы получите два числа, например 52 доллара и 2 предмета. В этом наборе данных 18 объектов, поэтому каждый центроид соответствует 18-мерному набору координат. И нет, мы не будем пытаться это визуализировать.
  4. Переназначьте каждую точку данных в категорию, соответствующую ближайшему центроиду.
  5. Повторяйте шаги 3 и 4, пока в категории больше не останется изменений.

Вот отличное изображение, которое поможет проиллюстрировать:

Кодирование модели K-средних в Python очень просто, как показано ниже, и на кластеры, которые генерируются моделью, можно ссылаться с помощью km.labels_ (не забывайте подчеркивание в конце!).

from sklearn.cluster import KMeans
km = KMeans(n_clusters=2)
km.fit(colleges.drop(‘Private’,axis=1))

Оценка

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

Два быстрых способа оценить производительность модели машинного обучения - это посмотреть на матрицу ошибок и отчет о классификации.

def convertToCluster(cluster):
    if cluster=='Yes':
        return 1
    else:
        return 0
colleges['Cluster'] = colleges['Private'].apply(convertToCluster)
from sklearn.metrics import classification_report,confusion_matrix
print(confusion_matrix(colleges['Cluster'],km.labels_))
print(classification_report(colleges['Cluster'],km.labels_))

Если вы привыкли к алгоритмам контролируемого обучения, вы можете посмотреть на эти результаты и подумать: «22% точности ?! Эта модель - мусор! В любом случае, для чего нужны модели без присмотра? » Но помните определение без учителя: модель стремится разобраться в беспорядке из 18 функций, которые мы ей дали, без ярлыков. Это непростая задача, поэтому давайте отдадим должное K-means там, где она должна быть зачислена.

~ Бонусный раздел ~ Сравнение алгоритмов обучения без учителя и с учителем

Давайте на самом деле сравним результаты, которые мы только что получили, с результатами модели контролируемого обучения, чтобы оценить их эффективность (или, по крайней мере, установить наши ожидания на должный низкий уровень для обучения без учителя 😉). Давайте просто воспользуемся классической логистической регрессией.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
unis = colleges
X = unis.drop('Cluster',axis=1)
y = unis['Cluster']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
logmodel = LogisticRegression()
logmodel.fit(X_train,y_train)
preds = logmodel.predict(X_test)
print("Using K means clustering (unsupervised):\n")
print(confusion_matrix(colleges['Cluster'],km.labels_))
print(classification_report(colleges['Cluster'],km.labels_))
print("Using logistic regression (supervised):\n")
print(confusion_matrix(y_test,preds))
print(classification_report(y_test,preds))

Узрите силу навешивания ярлыков, ребята. При использовании простой логистической регрессии и модели контролируемого обучения точность выросла с 22% до 91%, что, вероятно, можно было бы улучшить, выбрав другую модель.

Надеюсь, вы начнете понимать, насколько полезны K-средства для понимания беспорядочных данных! Не стесняйтесь исследовать другие области с помощью исследовательского анализа данных и смотреть, что вы найдете!