Основы машинного обучения Sklearn (основное введение дня 02)

алгоритм

@[toc]

Использование базового алгоритма (Sklearn)

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

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

Пошаговый вызов API оператора

оценщик

оценка = некоторый оператор API()

estimator.fit(x_train,y_train) выполняет операции и обучает соответствующую модель

estimator.predict(x_test) делать прогнозы (вызывать модель)

estimator.score(x_test,y_test) для оценки оценки модели

пошаговый анализ данных

1. Загрузите данные

2. Стандартизация данных, нормализация

3. Извлечение признаков данных, уменьшение размерности и т. д.

4. Резка и разделение данных, разделение обучающего набора и тестового набора

5. Использовать для оператора API

6. Используйте оценщик для обучения

7. Прогностическая оценка данных

8. Оптимизируйте на основе результатов тестирования

9. Сохраните модель оптимизированного алгоритма

Затем идут операторы по обработке данных.

Алгоритм классификации

Алгоритм KNN

описывать:

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

Используется для прогнозирования классификации! Например, классифицируйте местоположения на карте и предскажите, где пользователи больше всего любят собираться (а затем разместите рекламу, обратитесь к примеру с Facebook: предсказание места регистрации в Facebook).

принцип:

Для примера рассчитайте расстояние, соответствующее аналогичному значению и другим точкам (например, через евклидово расстояние и т. д.), чтобы найти приблизительную точку для деления.

преимущество:

  • Прост в реализации, не требует обучения

недостаток:

  • Ленивый алгоритм, большой объем вычислений и большие накладные расходы памяти при классификации тестовых образцов
  • Необходимо указать значение K. Если значение K выбрано неправильно, точность классификации не может быть гарантирована (в настоящее время требуется определенная самокоррекция, вот коррекция сетки sklearn)

Соответствующий API:

from sklearn.neighbors import KNeighborsClassifier

Пример кода:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

#用KNN对鸢尾花进行分类
def knn_iris():
    """用KNN算法对鸢尾花进行分类"""
    #1.获取数据
    iris=load_iris()
    #2.划分数据集
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=6)
    #3.特征工程:标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.transform(x_test)
    #4.KNN算法预估器
    estimator=KNeighborsClassifier(n_neighbors=3)
    estimator.fit(x_train,y_train)
    #5.模型评估
        #5.1 方法1:直接比对真实值和预测值
    y_predict=estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接比对真实值和预测值:\n",y_test==y_predict)
        #5.2 方法2:计算准确率
    score=estimator.score(x_test,y_test)
    print("准确率为:\n",score)

out:

у_прогноз: [0 2 0 0 2 1 1 0 2 1 2 1 2 2 1 1 2 1 1 0 0 2 0 0 1 1 1 2 0 1 0 1 0 0 1 2 1 2] Сравните фактические и прогнозные значения напрямую: [ True True True True True True True False True True True True True Верно Верно Верно Ложно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Верно Ложно Верно Правда правда] Точность: 0,9210526315789

оптимизация сетки

from sklearn.model_selection import GridSearchCV

Эта функция на самом деле очень проста, то есть упомянутая выше автоматическая установка параметров, то есть предыдущая estimator=KNeighborsClassifier(n_neighbors=3)

этоn_neighborsНа самом деле, мы должны продолжать попытки, поэтому здесь sklearn предоставляет метод, который поможет нам попробовать настройку этого параметра.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV

def knn_iris_gsv():
    """用KNN算法对鸢尾花进行分类,添加网格搜索和交叉验证"""
    #1.获取数据
    iris=load_iris()
    #2.划分数据集
    x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,random_state=6)
    #3.特征工程:标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test=transfer.transform(x_test)
    #4.KNN算法预估器
    estimator=KNeighborsClassifier()

    '''加入网格搜索与交叉验证'''
    #参数准备
    param_dict={"n_neighbors":[1,3,5,7,9,11],}#估计器参数
    estimator=GridSearchCV(estimator,param_grid=param_dict,cv=10)#estimator:估计器对象,cv:几折交叉验证,fit():输入训练数据,score():准确率

    estimator.fit(x_train,y_train)
    #5.模型评估
        #5.1 方法1:直接比对真实值和预测值
    y_predict=estimator.predict(x_test)
    print("y_predict:\n",y_predict)
    print("直接比对真实值和预测值:\n",y_test==y_predict)
        #5.2 方法2:计算准确率
    score=estimator.score(x_test,y_test)
    print("准确率为:\n",score)

    '''查看网格搜索与交叉验证结果'''
    # 最佳参数:best_params_
    print("最佳参数:\n", estimator.best_params_)
    # 最佳结果:best_score_
    print("最佳结果:\n", estimator.best_score_)
    # 最佳估计器:best_estimator_
    print("最佳估计器:\n", estimator.best_estimator_)
    # 交叉验证结果:cv_results_
    print("交叉验证结果:\n", estimator.cv_results_)

Дело здесь:

param_dict={"n_neighbors":[1,3,5,7,9,11],}#估计器参数
    estimator=GridSearchCV(estimator,param_grid=param_dict,cv=10)#estimator:估计器对象,cv:几折交叉验证,fit():输入训练数据,score():准确率

Кейс KNN (предсказуемый вход в Facebook)

Это случай позиционирования facebook.

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

набор данных:

Ссылка на сайт:disk.baidu.com/is/1нет несколько PX6o V…Код извлечения: 6666

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

Сначала данные выглядят так:

   row_id       x       y  accuracy    time    place_id
0       0  0.7941  9.0809        54  470702  8523065625
1       1  5.9567  4.7968        13  186555  1757726713
2       2  8.3078  7.0407        74  322648  1137537235
3       3  7.3665  2.5165        65  704587  6567393236
4       4  4.0961  1.1307        31  472130  7440663949
(29118021, 6)

№ 1. Получить данные data = pd.read_csv("../input/train.csv")

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

То есть так это выглядит после извлечения

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zHwVL7Rm-1637077656137)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211116224920034.png)]

Y выглядит так

place_id
1014605271    28
1015645743     4
1017236154    31
1024951487     5
1028119817     4
Name: row_id, dtype: int64

Тогда конкретный код выглядит следующим образом:

	# 1)缩小数据范围
data=data.query(" x<2.5 & x>2 & y<1.5 & y>1.0")
	# 2)处理时间特征
time_value=pd.to_datetime(data["time"],unit="s")
data["day"]=date.day
data["weekdaty"]=date.weekday
data["hour"]=date.hour
	# 3)过滤掉次数少的地点
place_count=data.groupby("place_id").count()["row_id"]
data_final = data[data["place_id"].isin(place_count[place_count>3].index.values)]
	# 4)筛选特征值和目标值
x=data_final[["x","y","accuracy","day","weekdaty","hour"]]
y=data_final["place_id"]

KNN обрабатывает прогнозы

Этот шаг представляет собой формулу:

	# 5)数据集划分
x_train,x_test,y_train,y_test=train_test_split(x,y)

#3.特征工程:标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

#4.KNN算法预估器
estimator=KNeighborsClassifier()
'''加入网格搜索与交叉验证'''
#参数准备
param_dict={"n_neighbors":[3,5,7,9]}#估计器参数
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)#estimator:估计器对象,cv:几折交叉验证,fit():输入训练数据,score():准确率
estimator.fit(x_train,y_train)

#5.模型评估
    #5.1 方法1:直接比对真实值和预测值
y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test==y_predict)
    #5.2 方法2:计算准确率
score=estimator.score(x_test,y_test)
print("准确率为:\n",score)
'''查看网格搜索与交叉验证结果'''
# 最佳参数:best_params_
print("最佳参数:\n", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果:\n", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:\n", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:\n", estimator.cv_results_)

полный код
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import GridSearchCV
# 1.获取数据
data=pd.read_csv("./FBlocation/train.csv")

# 2.基本数据处理
	# 1)缩小数据范围
data=data.query(" x<2.5 & x>2 & y<1.5 & y>1.0")
	# 2)处理时间特征
time_value=pd.to_datetime(data["time"],unit="s")
data["day"]=date.day
data["weekdaty"]=date.weekday
data["hour"]=date.hour
	# 3)过滤掉次数少的地点
place_count=data.groupby("place_id").count()["row_id"]
data_final = data[data["place_id"].isin(place_count[place_count>3].index.values)]
	# 4)筛选特征值和目标值
x=data_final[["x","y","accuracy","day","weekdaty","hour"]]
y=data_final["place_id"]
	# 5)数据集划分
x_train,x_test,y_train,y_test=train_test_split(x,y)

#3.特征工程:标准化
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)

#4.KNN算法预估器
estimator=KNeighborsClassifier()
'''加入网格搜索与交叉验证'''
#参数准备
param_dict={"n_neighbors":[3,5,7,9]}#估计器参数
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)#estimator:估计器对象,cv:几折交叉验证,fit():输入训练数据,score():准确率
estimator.fit(x_train,y_train)

#5.模型评估
    #5.1 方法1:直接比对真实值和预测值
y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test==y_predict)
    #5.2 方法2:计算准确率
score=estimator.score(x_test,y_test)
print("准确率为:\n",score)
'''查看网格搜索与交叉验证结果'''
# 最佳参数:best_params_
print("最佳参数:\n", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果:\n", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:\n", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:\n", estimator.cv_results_)

Наивный байесовский алгоритм

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

Наивный: это относится к предположению, что влияние набора данных игнорируется (набор данных может быть неполным), то есть предполагается, что каждый элемент в наборе данных независим!

  1. совместная вероятность Содержит несколько условий и вероятность того, что все условия выполняются одновременно.
  2. Условная возможность вероятность того, что время А наступит при условии, что другое время В уже произошло
  3. Независимый 如果P(A,B)=P(A)P(B),则称事件A与事件B相互独立
  4. байесовская формула P(C|W)=(P(W|C)PC) / P(W)
  5. просто Характеристики не зависят друг от друга
  6. Наивный байесовский алгоритм Наивный + байесовский
  7. Классификация приложений Классификация текста (слова как признаки)
  8. Коэффициент сглаживания Лапласа P(F1|C) = (числитель+α) / (знаменатель+αm) α: указанный коэффициент m: общее количество функций, появляющихся в учебном документе.

Вызов API:

from sklearn.naive_bayes import MultinomialNB

Перейдем непосредственно к примеру:

from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB

def nb_news():
    """
    用朴素贝叶斯算法对新闻进行分类
    :return:
    """
    #1.获取数据
    news = fetch_20newsgroups(subset="all")#subset="all"获取所有数据,train获取训练数据
    #2.划分数据集
    x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
    #3.特征工程:文本特征抽取-tfidf
    transfer = TfidfVectorizer()
    x_train = transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #4.朴素贝叶斯算法预估器流程
    estimator = MultinomialNB()
    estimator.fit(x_train, y_train)
    #5.模型评估
        # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
        # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)

y_predict:
 [15  2 16 ... 11 10 18]
直接比对真实值和预测值:
 [False  True False ...  True  True  True]
准确率为:
 0.8503820033955858

(PS: эти вещи можно оптимизировать с помощью сеток!)

Древо решений

Эту хрень знают все!

Ссылка вверх:воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо

[Основы теории информации]

  1. Информация Шеннон: устранить случайную неопределенность
  2. Измерение информации - количество информации - информационная энтропия 2.1 Единица: бит 2.2 Получение информации g(D|A) = H(D)-H(D|A) 2.3 Одна из основ разделения деревьев решений ------- Прирост информации (чем больше, тем лучше)

преимущество:

  • Визуализация - сильная интерпретируемость

недостаток:

  • Деревья решений плохо работают для слишком сложных деревьев (переоснащение)

Улучшать:

  • алгоритм обрезки корзины
  • случайный лес

вызов API

from sklearn.tree import DecisionTreeClassifier

кейс

Дерево решений для классификации данных по радужной оболочке

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier,export_graphviz

def decision_iris():
    """用决策树对决策树对鸢尾花进行分类"""
    #1.获取数据集
    iris = load_iris()
    #2.划分数据集
    x_train,x_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=22)
    #3.决策树预估器
    estimator = DecisionTreeClassifier(criterion="entropy")
    estimator.fit(x_train,y_train)
    #4.模型评估
        # 方法1:直接比对真实值和预测值
    y_predict = estimator.predict(x_test)
    print("y_predict:\n", y_predict)
    print("直接比对真实值和预测值:\n", y_test == y_predict)
        # 方法2:计算准确率
    score = estimator.score(x_test, y_test)
    print("准确率为:\n", score)
    #可视化决策树
    export_graphviz(estimator,out_file="iris_tree.dot",feature_names=iris.feature_names)

Визуальное дерево решений

export_graphviz(estimator,out_file="iris_tree.dot",feature_names=iris.feature_names)

Это создаст файл, а затем разместит его на веб-сайте для его анализа.

случайный лес

Ссылка вверх:воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо

Резюме в одном предложении: запустите несколько лесов, а затем объедините их.

[Метод ансамблевого обучения] Ансамблевое обучение решает одну задачу прогнозирования, создавая комбинацию нескольких моделей. Он работает, создавая несколько классификаторов/моделей, каждый из которых обучается и делает прогнозы независимо. Эти прогнозы, наконец, объединяются в комбинированные прогнозы, тем самым превосходя любые прогнозы одного класса. [Случайный лес] Случайный: тренировочный набор случайный, функции случайные Лес: классификатор с несколькими деревьями решений.

API

from sklearn.ensemble import RandomForestClassifier

набор данных:

Ссылка на сайт:disk.baidu.com/yes/1co подоперационная система…Код извлечения: 6666

Случайные леса предсказывают выживание пассажиров Титаника

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
#获取数据
path="./titanic.csv"
titanic=pd.read_csv(path)
#筛选特征值和目标值
x=titanic[["pclass","age","sex"]]
y=titanic["survived"]
#2.数据处理
	#2.1缺失值处理
x["age"].fillna(x["age"].mean(),inplace=True)
	#2.2转换成字典
x=x.to_dict(orient="records")
#3.数据集划分 
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=22)
#4.字典特征抽取
transfer=DictVectorizer()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
estimator=RandomForestClassifier()
#加入网格搜索与交叉验证
#参数准备
param_dict={"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,15,25,30]}#估计器参数
estimator=GridSearchCV(estimator,param_grid=param_dict,cv=3)#estimator:估计器对象,cv:几折交叉验证,fit():输入训练数据,score():准确率
estimator.fit(x_train,y_train)
#5.模型评估
    #5.1 方法1:直接比对真实值和预测值
y_predict=estimator.predict(x_test)
print("y_predict:\n",y_predict)
print("直接比对真实值和预测值:\n",y_test==y_predict)
    #5.2 方法2:计算准确率
score=estimator.score(x_test,y_test)
print("准确率为:\n",score)
'''查看网格搜索与交叉验证结果'''
# 最佳参数:best_params_
print("最佳参数:\n", estimator.best_params_)
# 最佳结果:best_score_
print("最佳结果:\n", estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器:\n", estimator.best_estimator_)
# 交叉验证结果:cv_results_
print("交叉验证结果:\n", estimator.cv_results_)

Алгоритмы регрессии и кластеризации

Линейная регрессия

Ссылка вверх:воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо по

Этот старый друг, давайте посмотрим на определение, данное учителем:

[Линейная регрессия]

  1. проблема регрессии Целевое значение - непрерывные данные
  2. определение

Функциональная связь (линейная модель): установить связь между собственными значениями и целевыми значениями. у = w1x1 + w2x2 + w3x3 + ... + wnxn + b = wTx + b 3. Обобщенные линейные модели. А. Независимая переменная один раз (линейная зависимость) у = w1x1 + w2x2 + w3x3 + ... + wnxn + b = wTx + b б. Параметр один раз (нелинейная зависимость) у = w1x1 + w2x1^2 + w3x1^3 + w4x2^3 + ... + б 4. Потери и принципы оптимизации линейной регрессии Цель: найти параметры модели Функция потерь/стоимость/функция стоимости/целевая функция -- минимум -- метод наименьших квадратов Потеря оптимизации (метод оптимизации) А. Нормальные уравнения (гениальность) Решите непосредственно для w б. Градиентный спуск (трудолюбивые обычные люди) проб и ошибок, улучшение Классификация Градиентный спуск GD: вычислите значение всех выборок, чтобы получить градиент Стохастический градиентный спуск SGD: рассматривайте только одну выборку за раз Метод стохастического среднего градиента SAG 5. Оценка эффективности регрессии Механизм оценки среднеквадратичной ошибки (MSE)

нормальное уравнение

API

from sklearn.linear_model import LinearRegression

Особенности: Быстрая работа, подходит для небольших образцов данных

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression,SGDRegressor
from sklearn.metrics import mean_squared_error

def linear1():
    """正规方程的优化方法对波士顿房价进行预测"""
    #1.获取数据
    boston=load_boston()
    print("特征数量:\n",boston.data.shape)
    #2.划分数据集
    x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
    #3.标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #4.预估器
    estimator=LinearRegression()
    estimator.fit(x_train,y_train)
    #5.得出模型
    print("正规方程-权重系数为:\n",estimator.coef_)
    print("正规方程-偏置为:\n",estimator.intercept_)
    #6.模型评估
    y_predict=estimator.predict(x_test)
    print("正规方程-预测房价:\n",y_predict)
    error=mean_squared_error(y_test,y_predict)
    print("正规方程-均方误差为:\n",error)

градиентный спуск

этот код выше

from sklearn.linear_model import SGDRegressor

def linear2():
    """梯度下降的优化方法对波士顿房价进行预测"""
    #1.获取数据
    boston=load_boston()
    #2.划分数据集
    x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
    #3.标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #4.预估器
    estimator=SGDRegressor(learning_rate="constant",eta0=0.01,max_iter=10000)
    estimator.fit(x_train,y_train)
    #5.得出模型
    print("梯度下降-权重系数为:\n",estimator.coef_)
    print("梯度下降-偏置为:\n",estimator.intercept_)
    # 6.模型评估
    y_predict = estimator.predict(x_test)
    print("梯度下降-预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("梯度下降-均方误差为:\n", error)

Ридж Возвращение

Основной проблемой здесь являются первые два метода, а именно:

[Недообучение и переоснащение]

  1. Обучающий набор работает хорошо, тестовый набор плохо - переобучение 2. Плохая производительность на тренировочном наборе, плохая на тестовом наборе — недообучение.
  2. Причина и решение 3.1 Недооснащение Причина: слишком мало признаков изученных данных Решение. Увеличьте количество признаков в данных. 3.2 Переобучение Причина: слишком много оригинальных функций, есть некоторые зашумленные функции, модель слишком сложна, потому что модель пытается учитывать различные точки тестовых данных. Решение: регуляризация L1-LASSO: функция потерь + штрафной член λ (|w|) L2-Ridge Регрессия хребта: чаще используется (функция потерь + штрафной член λ (w²))

Вот для решения этой проблемы и была введена эта штука

from sklearn.linear_model import Ridge

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error

def linear3():
    """岭回归对波士顿房价进行预测"""
    #1.获取数据
    boston=load_boston()
    #2.划分数据集
    x_train,x_test,y_train,y_test=train_test_split(boston.data,boston.target,random_state=22)
    #3.标准化
    transfer=StandardScaler()
    x_train=transfer.fit_transform(x_train)
    x_test = transfer.transform(x_test)
    #4.预估器
    estimator=Ridge(alpha=0.5,max_iter=10000)
    estimator.fit(x_train,y_train)
    #5.得出模型
    print("岭回归-权重系数为:\n",estimator.coef_)
    print("岭回归-偏置为:\n",estimator.intercept_)
    # 6.模型评估
    y_predict = estimator.predict(x_test)
    print("岭回归-预测房价:\n", y_predict)
    error = mean_squared_error(y_test, y_predict)
    print("岭回归-均方误差为:\n", error)


Логистическая регрессия и бинарная классификация

[Принципы логистической регрессии]

  1. Вход: выход линейной регрессии является входом логистической регрессии.
  2. Функция активации: замените сигмовидную функцию: 1/(1+e^(-x))
  3. Функция потерь Логарифмическая потеря правдоподобия
  4. Потеря оптимизации: градиентный спуск

[две категории]

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

from sklearn.linear_model import LogisticRegression

Не путайте это с обычным уравнением.

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

#1.读取数据
path="https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin','Normal Nucleoli', 'Mitoses', 'Class']
data=pd.read_csv(path,names=column_name)
#2.缺失值处理
	#2.1替换-->np.nan
data=data.replace(to_replace="?",value=np.nan)
	#2.2删除缺失样本
data.dropna(inplace=True)
#筛选特征值和目标值
x=data.iloc[:,1:-1]
y=data["Class"]
#3.划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y)
#4.特征工程
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#5.预估器流程 
estimator=LogisticRegression()
estimator.fit(x_train,y_train)
#逻辑回归的模型参数:回归系数和偏置
print("特征参数:",estimator.coef_)
#6.模型评估
    # 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

Классификационная оценка

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

Метод оценки классификации]

  1. матрица путаницы Пример TP True = True Positive Псевдоположительный результат FP = ложный положительный результат FN Ложноотрицательный = Ложноотрицательный TN True Negative = True Negative
  2. Точность и отзыв

Коэффициент точности: доля предсказанных положительных образцов, которые на самом деле являются положительными. Коэффициент отзыва: доля предсказанных положительных образцов среди реальных положительных образцов (отличительная способность положительных образцов). F1-оценка: надежность модели 3. ROC-кривая и показатель AUC (может измерять оценку при несбалансированной выборке) 3.1 TPR: TP/(TP+FN) Среди всех образцов с истинным классом 1 доля предсказанного класса 1 (уровень полноты) 3.2 FPR: FP/(FP+TN) Среди всех образцов с истинным классом 0 доля предсказанного класса 1 3.3 AUC можно использовать только для оценки бинарной классификации (например, в приведенном выше примере). AUC отлично подходит для оценки производительности классификатора в несбалансированных выборках.

from sklearn.metrics import classification_report

from sklearn.metrics import roc_auc_score

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score

#1.读取数据
path="https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data"
column_name = ['Sample code number', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin','Normal Nucleoli', 'Mitoses', 'Class']
data=pd.read_csv(path,names=column_name)
#2.缺失值处理
	#2.1替换-->np.nan
data=data.replace(to_replace="?",value=np.nan)
	#2.2删除缺失样本
data.dropna(inplace=True)
#筛选特征值和目标值
x=data.iloc[:,1:-1]
y=data["Class"]
#3.划分数据集
x_train,x_test,y_train,y_test=train_test_split(x,y)
#4.特征工程
transfer=StandardScaler()
x_train=transfer.fit_transform(x_train)
x_test=transfer.transform(x_test)
#5.预估器流程 
estimator=LogisticRegression()
estimator.fit(x_train,y_train)
#逻辑回归的模型参数:回归系数和偏置
print("特征参数:",estimator.coef_)
#6.模型评估
    # 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
    # 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

#查看精确率,召回率,F1-score
report=classification_report(y_test,y_predict,labels=[2,4],target_names=["良性","恶性"])
#AUC指标
#y_true:每个样本的真实类别,必须为0(反例),1(正例)标记
#y_test转换成 0 1
y_true=np.where(y_test>3,1,0)
auc=roc_auc_score(y_true,y_predict)
print("auc:\n",auc)

Алгоритм неконтролируемой кластеризации K-средних

[Обучение без присмотра]

  1. определение Нет целевого значения - обучение без учителя 2. Включенные алгоритмы Кластеризация: K-средние (кластеризация K-средних) Уменьшение размерности: PCA

[Шаги алгоритма K-средних]

  1. Случайным образом установите точки в пространстве признаков K в качестве начальных центров кластеров. 2. Рассчитайте расстояние до K центров для каждой другой точки и выберите ближайшую центральную точку кластера для неизвестной точки в качестве категории маркера.

    1. Рядом с отмеченным центром кластера пересчитайте новую центральную точку (среднюю) для каждого кластера.

    2. Если рассчитанная новая центральная точка совпадает с исходной центральной точкой, завершите, в противном случае повторите процесс второго шага.

    3. Преимущества и недостатки

      преимущество:

      ​ Принимает итеративный алгоритм, интуитивно понятный и очень практичный

      недостаток:

      Легко сходятся к локальному оптимальному решению (решение: множественная кластеризация)

注意: 聚类一般做在分类之前!

API:

from sklearn.cluster import KMeans

оценивать:

from sklearn.metrics import silhouette_score

Этот пример:

Исследуйте подразделение предпочтений пользователей по категориям товаров.В этом случае классификация товаров, которые нравятся пользователям, получается с помощью кластерного анализа.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U38sJMcI-1637077656140)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211116233645003.png)]

Кто-то уже сделал это

набор данных:

Ссылка на сайт:disk.baidu.com/yes/1P9 надеюсь v YY A…Код извлечения: 6666

import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
#1.获取数据
order_products=pd.read_csv("./data/order_products__prior.csv")
products=pd.read_csv("./data/products.csv")
orders=pd.read_csv("./data/orders.csv")
aisles=pd.read_csv("./data/aisles.csv")
# 2、合并表
#合并aisles和products   aisle和product_id
tab1=pd.merge(aisles,products,on=["aisle_id","aisle_id"])[:100]
tab2=pd.merge(tab1,order_products,on=["product_id","product_id"])[:100]
tab3=pd.merge(tab2,orders,on=["order_id","order_id"])[:100]
#3.找到user_id和aisle之间的关系
table=pd.crosstab(tab3["user_id"],tab3["aisle"])
data=table[:10000]#取一部分节省时间
#4.PCA降维
#4.1实例化转换器类
transfer=PCA(n_components=0.95)
#4.2调用fit_transform
data_new=transfer.fit_transform(data)

#5.预估器流程
estimator=KMeans(n_clusters=3)
estimator.fit(data_new)
y_predict=estimator.predict(data_new)
#模型评估-轮廓系数
silhouette_num=silhouette_score(data_new,y_predict)
print("轮廓系数:\n",silhouette_num)

Загрузка и сохранение модели


import joblib
1.保存
joblib.dump(estimator,'test.pkl')
2.加载
estimator = joblib.load('test.pkl')

Сводная карта (примерно)

在这里插入图片描述