红酒分类案例中使用分箱处理

红酒分类案例中使用分箱处理

描述

在建立分类模型时,通常需要对连续特征进行离散化(Discretization)处理 ,特征离散化后,模型更加稳定,降低了过拟合风险。离散化也叫分箱(binning),是指把连续的特征值划分为离散的特征值(划分为不同的箱子),比如把0-100分的考试成绩由连续数值转换为80以上、60~80之间、60以下三个分箱值(可以用0、1、2或独热编码表示),分箱后有助于提升分类模型的表现。

本任务的实践内容包括:

1、学习并熟悉Scikit-learn中的分箱处理类KBinsDiscretizer。

2、在红酒预测案例中引入分箱处理,对比分类模型的性能。

源码下载

环境

  • 操作系统:Windows 10、Ubuntu18.04

  • 工具软件:Anaconda3 2019、Python3.7

  • 硬件环境:无特殊要求

  • 依赖库列表

    scikit-learn	0.24.2
    numpy           1.19.5
    pandas          1.1.5
    ipython         7.16.3
    

分析

本任务涉及以下环节:

A)熟悉KBinsDiscretizer的参数及分箱策略

B)加载并观察红酒数据集

C)建立KNN分类模型,评估成绩

D)进行分箱预处理

E)对比模型在分箱后数据上的表现

实施

1、熟悉Scikit-learn的分箱功能

1、生成一组随机成绩

2、分别使用等宽、等频、聚类等策略以及独热编码方式进行分箱

from sklearn.preprocessing import KBinsDiscretizer
import numpy as np

# 随机生成一组成绩
np.random.seed(seed=1)
score = np.random.randint(0, 100, 12)
score.sort() # 排序
print(score)

# 等宽分箱(uniform),分4箱(n_bins),每个箱的数值宽度相同,数字顺序编码(ordinal)
bins =KBinsDiscretizer(n_bins=[4], encode='ordinal', strategy='uniform')
X = bins.fit_transform(score.reshape(-1, 1))
print(X.T)

# 等频分箱(uniform),分4箱(n_bins),每个箱的元素个数相同,数字顺序编码(ordinal)
bins =KBinsDiscretizer(n_bins=[4], encode='ordinal', strategy='quantile')
X = bins.fit_transform(score.reshape(-1, 1))
print(X.T)

# 聚类分箱(kmeans),分4箱,每个箱中的值到其1维K均值聚类簇心的距离相同,数字顺序编码(ordinal)
bins =KBinsDiscretizer(n_bins=[4], encode='ordinal', strategy='kmeans')
X = bins.fit_transform(score.reshape(-1, 1))
print(X.T)

# 等宽分箱(uniform),分4份(n_bins),每份数值宽度相同,独热编码(onehot)
bins =KBinsDiscretizer(n_bins=[4], encode='onehot', strategy='uniform')
X = bins.fit_transform(score.reshape(-1, 1))
print(X.toarray())

结果如下:

[ 1  5  9 12 16 37 64 71 72 75 76 79]
[[0. 0. 0. 0. 0. 1. 3. 3. 3. 3. 3. 3.]]
[[0. 0. 0. 1. 1. 1. 2. 2. 2. 3. 3. 3.]]
[[0. 0. 0. 0. 0. 1. 2. 2. 2. 3. 3. 3.]]
[[1. 0. 0. 0.]
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]
 [1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 0. 1.]
 [0. 0. 0. 1.]
 [0. 0. 0. 1.]
 [0. 0. 0. 1.]
 [0. 0. 0. 1.]
 [0. 0. 0. 1.]]

2、加载查看红酒数据集

from sklearn.datasets import load_wine
from sklearn.model_selection import  train_test_split
from sklearn.neighbors import KNeighborsClassifier
from IPython.display import display
import pandas as pd

# 加载、查看wine数据集
wine = load_wine()
df = pd.DataFrame(wine.data, columns=wine.feature_names)
display(df)

结果如下:

请添加图片描述

3、对比分箱前后KNN分类模型的性能

# 不进行分箱处理,直接拆分并使用KNN建模
X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target, random_state=0) 
knn = KNeighborsClassifier(5).fit(X_train, y_train)
score = knn.score(X_test, y_test)
print('Score without bins: %0.2f'%score) # 输出成绩

# 先进行分箱处理,再拆分建模,对比模型成绩
bins =KBinsDiscretizer(n_bins=[7 for i in range(13)], encode='ordinal', strategy='uniform')
data_bins = bins.fit_transform(wine.data)

X_train_bins, X_test_bins, y_train, y_test = train_test_split(data_bins, wine.target, random_state=0)
knn = KNeighborsClassifier(5).fit(X_train_bins, y_train)
score = knn.score(X_test_bins, y_test)
print('Score with bin: %0.2f'%score)

结果如下:

Score without bins: 0.73
Score with bin: 0.98

对连续特征进行分箱离散化后,分类模型的性能提升明显。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KNN(K-最近邻)算法是一种常用的机器学习算法,可以用于对数据进行分类和回归。在葡萄分类,可以利用KNN算法对不同种类的葡萄进行分类。 首先,我们需要准备一组带有标签的葡萄数据集,包括葡萄的特征(比如精含量、酸度、颜色等)和对应的分类标签(比如葡萄、白葡萄等)。 接下来,我们可以使用Python编写一个简单的KNN分类器,可以使用scikit-learn库的KNeighborsClassifier类。下面是一个简单的示例代码: ```python from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载葡萄数据集 wine = datasets.load_wine() X = wine.data y = wine.target # 将数据集分为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 特征标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 构建KNN分类器 knn = KNeighborsClassifier(n_neighbors=3) knn.fit(X_train, y_train) # 在测试集上进行预测 y_pred = knn.predict(X_test) # 计算准确率 accuracy = accuracy_score(y_test, y_pred) print("准确率:", accuracy) ``` 在以上代码,我们首先加载了葡萄数据集,然后将其分为训练集和测试集。接着,我们对特征进行了标准化处理,然后构建了一个KNN分类器并在测试集上进行了预测,并最终计算出了分类的准确率。 通过这样的方式,我们可以利用KNN算法对葡萄进行分类,并得到相应的分类准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值