Scikit-learn学习系列 | 1. sklearn的简要使用介绍与数据集获取

简介: Scikit-learn学习系列 | 1. sklearn的简要使用介绍与数据集获取

1. scikit-learn概述


在工程应用中,用python手写代码来从头实现一个算法的可能性非常低,这样不仅耗时耗力,还不一定能够写出构架清晰,稳定性强的模型。更多情况下,是分析采集到的数据,根据数据特征选择适合的算法,在工具包中调用算法,调整算法的参数,获取需要的信息,从而实现算法效率和效果之间的平衡。而sklearn,正是这样一个可以帮助我们高效实现算法应用的工具包。


1.1 技巧介绍

# 技巧1: 缩放处理
from sklearn import preprocessing
# feature_range: 设置缩放范围
scaler = preprocessing.MinMaxScaler(feature_range=(-1, 1)) 
scaler.fit(iris.data) 
iris.data[:5]
"""
输出:
array([[5.1, 3.5, 1.4, 0.2],
   [4.9, 3. , 1.4, 0.2],
   [4.7, 3.2, 1.3, 0.2],
   [4.6, 3.1, 1.5, 0.2],
   [5. , 3.6, 1.4, 0.2]])
"""
data = scaler.transform(iris.data)
data[:5]
"""
输出:
array([[-0.55555556,  0.25      , -0.86440678, -0.91666667],
       [-0.66666667, -0.16666667, -0.86440678, -0.91666667],
       [-0.77777778,  0.        , -0.89830508, -0.91666667],
       [-0.83333333, -0.08333333, -0.83050847, -0.91666667],
       [-0.61111111,  0.33333333, -0.86440678, -0.91666667]])
"""
# 技巧2:分类模型评分报告
from sklearn.metrics import classification_report
 # 分类模型评分报告
report = classification_report(target, clf.predict(data), target_names = iris.target_names)
print(report)
# 输出:
"""
         precision    recall  f1-score   support
      setosa       1.00      1.00      1.00        50
  versicolor       0.92      0.98      0.95        50
   virginica       0.98      0.92      0.95        50
    accuracy                           0.97       150
   macro avg       0.97      0.97      0.97       150
weighted avg       0.97      0.97      0.97       150  
"""
# 技巧3:交叉验证
from sklearn.model_selection import cross_val_score
# 采用5折交叉验证
scores = cross_val_score(clf, data, target,c v=5)


1.2 模型保存

# 方法1:使用pickle 
import pickle 
model_saved = pickle.dumps(model)        # 保存模型成字符串
model_loaded = pickle.loads(model_saved) # 从字符串加载模型
model_loaded.predict(data)
# 方法2:使用joblib
import joblib
joblib.dump(model, 'model_saved_joblib.pkl')           # 保存模型到文件
model_loaded = joblib.load('model_saved_joblib.pkl') # 加载模型
model_loaded.predict(data)


1.3 模型优化

优化模型的方法包括: 网格搜索法,随机搜索法,模型特定交叉验证,信息准则优化


1)网格搜索法 GridSearchCV


所谓网格:就是预先通过网格的方式给定每个超参数的可能数值,各种超参数可能的数值,组成了二维网格。网格搜索法在指定的超参数空间中对每一种可能的情况进行交叉验证评分并选出最好的超参数组合。使用网格搜索法或随机搜索法可以对Pipeline进行参数优化,也可以指定多个评估指标。


2)随机搜索法 (RandomizedSearchCV)


随机搜索法和网格搜索法作用类似,但是只在超参数空间中进行指定次数的不同采样。采样次数通过n_iter参数指定,通过调整其大小可以在效率和性能方面取得平衡。其采样方法调用ParameterSampler函数,采样空间必须用字典进行指定。网格搜索法只能在有限的超参数空间进行暴力搜索,但随机搜索法可以在无限的超参数空间进行随机搜索。


2. scikit-learn涵盖内容


四大问题以及算法分类 — 算法工程

分类问题相关算法:把输入数据集,按照指定的类型进行分类。

聚类问题相关算法:把输入数据集,让机器自动发现数据的类型,并进行分类。

回归问题相关算法:用一个特定的曲线拟合数据集中的数据特征。

降维问题相关算法:降低输入数据集的维度,使得复杂问题简化。


算法模型选择:对于特定的现实问题,选择合适的模型

模型初选:针对特定的数据集和要解决的问题,从Scikit-learn支持的众多的模型中初步选择一个模型。

模型训练:用输入数据对模型进行训练

模型评估:对训练后的模型进行评估

模型优化:对训练后的模型进行超参数优化

模型终选:比较各种模型和优化结果,选择最终的模型


数据的预处理 — 特征工程

在把数据送入到模型中进行训练前,需要对数据进行预处理

数据的获取:通过Scikit-learn提供的工具,从外部读取数据到内存,并按照期望的方式组织数据

数据预处理:对于读取的数据进行预处理,如过滤无效数据、对强化、变形等等

特征的提取:从数据中提取特征数据,这些特征数据作为模型的输入(而不是原始的数据)

特征的选择:在众多提取的特征中,根据需要选择一定的特征数据,用于最终模型的训练。


3. scikit-learn数据集获取


image.png

  • scikit-learn自带数据集介绍:

自带的小数据集:安装后,这些数据集一并安装,xxx.load_xxx()

在线下载的数据集:下载远程数据集

计算机生成的数据集:通过某种数学算法,生成数据集

svmlight/svm格式的数据集: 从文件冲去数据集

mldata.org: 在线下载由mldata.org提供的大型数据集


  • 计算机自动生成数据集:

make_blobs 可用于聚类和分类

make_classification 可用于分类

make_circles 可用于分类

make_moons 可用于分类

make_multilabel_classification 可用于多标签分类

make_regression 可用于回归


3.1 生成聚类数据:make_blobs

# 案例1:生成聚类数据:make_blobs
from sklearn.datasets import make_blobs  # 生成数据 make_blobs
# 生成数据集
# n_samples:样本总数
# centers:中心点坐标,与分类数一致
# n_features:分类数
# cluster_std:正态分布的标准方差
# random_state:随机种子,确保每次运行,生成的随机数是一样的
X, labels=make_blobs(n_samples=200,centers=[[1,1],[-1,-1],[1,-1]], n_features=2, cluster_std=0.3, random_state = 0)
# 可视化方法1:
# 通过pandas可视化数据,np.c_[X,labels]将特征数据与label结合成为一个表格
df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels'])  # 生成DataFrame式的表格
# x = df['feature1']
# y = df['feature2']
# s: 设置透明度
# c: 设置每个样本的颜色,类别相同颜色相同
# alpha: 设置透明度
df.plot.scatter('feature1','feature2', s = 100, c = list(df['labels']), cmap = 'rainbow',colorbar = False, alpha = 0.8,title = 'dataset by make_blobs')
# 可视化方法2:
X, labels=make_blobs(n_samples=200,centers=[[1,1],[-1,-1],[1,-1]], n_features=2, cluster_std=0.3, random_state=42)
plt.scatter(X[:,0], X[:,1], c=labels, s=50, alpha=0.9)  # 直接生成散点图,比较简单但是样式少

image.png


3.2 生成分类数据:make_classification

# 案例2:生成分类数据:make_classification
from sklearn.datasets import make_classification
# n_samples:样本数
# n_features:特征数目
# n_classes:分类数目
# n_redundant:冗余数
X,labels=make_classification(n_samples=300, n_features=2, n_classes = 2, n_redundant=0, n_informative=2, 
                             random_state=0, n_clusters_per_class=2)
# 通过np.c_[X,labels]将特征数据与label结合成为一个表格
df = pd.DataFrame(np.c_[X, labels],columns = ['feature1','feature2','labels'])
# 将label从浮点型转化为整形,以下两行都可以
# df['labels'].astype(int)
df['labels'] = df['labels'].astype('i2')   
# 可视化展示
df.plot.scatter('feature1','feature2', s = 100, c = list(df['labels']),cmap = 'rainbow',colorbar = False,
                alpha = 0.8,title = 'dataset by make_classification')

image.png


3.3 生成环形数据:make_circles

# 案例3:生成环形数据:make_circles
from sklearn.datasets import make_circles
# noise: 表示数据的交互程度,数值越到表示两个数据融合得比较充分
# factor: 数据向外的扩张系数,数值越高表示越发散
X,labels=make_circles(n_samples=200,noise=0.05,factor=0.3,random_state=42)
# 通过np.c_[X,labels]将特征数据与label结合成为一个表格
df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels'])
df.plot.scatter('feature1','feature2', s = 100, c = list(df['labels']),cmap = 'rainbow',colorbar = False, 
                alpha = 0.8,title = 'dataset by make_circles')

image.png


3.4 生成回归数据:make_regression

# 案例4: 生成回归数据:make_regression
from sklearn.datasets import make_regression
# 生成数据集
# n_samples:样本个数
# n_features:输入数据的维度,这里是1维x轴
# n_targets:输出数据的维度,这里是1为y轴
# bias:数据偏置大小
# noise:叠加的噪声大小
# random_state:随机种子
X,Y,coef = make_regression(n_samples=100, n_features=1, n_informative=1, n_targets=1, bias=5, effective_rank=None, 
                           tail_strength= 0, noise= 10, shuffle=True, coef=True, random_state=42)
# 通过np.c_[X,labels]将特征数据与label结合成为一个表格
df = pd.DataFrame(np.c_[X ,Y],columns = ['X','y'])
# 通过xlim与ylim来设置表格的范围
df.plot.scatter('X','y', s = 100, c = "blue", cmap = 'rainbow',colorbar = False, 
                alpha = 0.8,title = 'dataset by make_regression', xlim=(-3, 3), ylim=(-150, 150))

image.png


3.5 导入外部的数据集

import numpy as np
import pandas as pd
# 外部文件名,可以是excel、csv文件,可以是txt文件
df_demo = pd.read_csv('demo.xlsx', encoding='utf-8', names=[['feature1', 'feature2']])
df_demo = pd.read_excel('demo.xlsx', sheet_name=1)   # 无需指定编码格式,全部都能读取


参考资料:

博主“文火冰糖的硅基工坊”的专栏——机器学习与scikit-learn


目录
相关文章
|
1天前
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
12 3
|
1月前
|
数据可视化 数据挖掘 大数据
1.1 学习Python操作Excel的必要性
学习Python操作Excel在当今数据驱动的商业环境中至关重要。Python能处理大规模数据集,突破Excel行数限制;提供丰富的库实现复杂数据分析和自动化任务,显著提高效率。掌握这项技能不仅能提升个人能力,还能为企业带来价值,减少人为错误,提高决策效率。推荐从基础语法、Excel操作库开始学习,逐步进阶到数据可视化和自动化报表系统。通过实际项目巩固知识,关注新技术,为职业发展奠定坚实基础。
|
2月前
|
Python
Python学习的自我理解和想法(10)
这是我在千锋教育B站课程学习Python的第10天笔记,主要学习了函数的相关知识。内容包括函数的定义、组成、命名、参数分类(必须参数、关键字参数、默认参数、不定长参数)及调用注意事项。由于开学时间有限,记录较为简略,望谅解。通过学习,我理解了函数可以封装常用功能,简化代码并便于维护。若有不当之处,欢迎指正。
|
2月前
|
Python 容器
Python学习的自我理解和想法(9)
这是我在B站跟随千锋教育学习Python的第9天,主要学习了赋值、浅拷贝和深拷贝的概念及其底层逻辑。由于开学时间紧张,内容较为简略,但希望能帮助理解这些重要概念。赋值是创建引用,浅拷贝创建新容器但元素仍引用原对象,深拷贝则创建完全独立的新对象。希望对大家有所帮助,欢迎讨论。
|
2月前
|
存储 安全 索引
Python学习的自我理解和想法(8)
这是我在B站千锋教育学习Python的第8天,主要内容是元组。元组是一种不可变的序列数据类型,用于存储一组有序的元素。本文介绍了元组的基本操作,包括创建、访问、合并、切片、遍历等,并总结了元组的主要特点,如不可变性、有序性和可作为字典的键。由于开学时间紧张,内容较为简略,望见谅。
|
2月前
|
Python
Python学习的自我理解和想法(7)
学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码! 今天是学Python的第七天,学的内容是集合。开学了,时间不多,写得不多,见谅。
|
2月前
|
存储 索引 Python
Python学习的自我理解和想法(6)
这是我在B站千锋教育学习Python的第6天笔记,主要学习了字典的使用方法,包括字典的基本概念、访问、修改、添加、删除元素,以及获取字典信息、遍历字典和合并字典等内容。开学后时间有限,内容较为简略,敬请谅解。
|
2月前
|
索引 Python
Python学习的自我理解和想法(5)
这是我在B站千锋教育学习Python的第五天笔记,主要内容包括列表的操作,如排序(`sort()`、``sorted()``)、翻转(`reverse()`)、获取长度(`len()`)、最大最小值(`max()`、``min()``)、索引(`index()`)、嵌套列表和列表生成(`range`、列表生成式)。通过这些操作,可以更高效地处理数据。希望对大家有所帮助!
|
2月前
|
存储 索引 Python
Python学习的自我理解和想法(4)
今天是学习Python的第四天,主要学习了列表。列表是一种可变序列类型,可以存储任意类型的元素,支持索引和切片操作,并且有丰富的内置方法。主要内容包括列表的入门、关键要点、遍历、合并、判断元素是否存在、切片、添加和删除元素等。通过这些知识点,可以更好地理解和应用列表这一强大的数据结构。
|
2月前
|
程序员 Python
Python学习的自我理解和想法(3)
这是学习Python第三天的内容总结,主要围绕字符串操作展开,包括字符串的提取、分割、合并、替换、判断、编码及格式化输出等,通过B站黑马程序员课程跟随老师实践,非原创代码。

热门文章

最新文章

推荐镜像

更多