当前位置: 首页> 健康> 美食 > 01-机器学习--Scikit-learn

01-机器学习--Scikit-learn

时间:2025/7/9 22:14:55来源:https://blog.csdn.net/alb3117149013/article/details/141332384 浏览次数:0次

一.Scikit-learn介绍

  • Scikit-learn(通常简称为 sklearn)是一个用于机器学习和数据挖掘的 Python 库。它提供了大量的机器学习算法和工具,支持分类、回归、聚类、降维、模型选择和数据预处理等任务。Scikit-learn 的目标是提供一个简单、有效、易于使用的机器学习库,以便用户能够快速构建和评估模型。

安装

python -m pip install scikit-learn  -i https://pypi.tuna.tsinghua.edu.cn/simple

主要功能和组件

  1. 分类 (Classification)

    • 目标:预测离散标签或类别。
    • 常用算法:Logistic Regression、K-Nearest Neighbors (KNN)、Support Vector Machines (SVM)、Decision Trees、Random Forest、Naive Bayes、Gradient Boosting、Neural Networks(MLP)。
    • 示例:识别邮件是否为垃圾邮件,或预测某人是否会购买某个产品。
  2. 回归 (Regression)

    • 目标:预测连续数值。
    • 常用算法:Linear Regression、Ridge Regression、Lasso Regression、Support Vector Regression (SVR)、Decision Trees、Random Forests、Gradient Boosting.
    • 示例:预测房价、股市价格或温度。
  3. 聚类 (Clustering)

    • 目标:将数据分组为不同的簇或类别。
    • 常用算法:K-Means、DBSCAN、Agglomerative Clustering、Mean Shift、Spectral Clustering。
    • 示例:客户细分、图像分割。
  4. 降维 (Dimensionality Reduction)

    • 目标:减少数据的特征数量,同时尽可能保留数据的结构和信息。
    • 常用算法:Principal Component Analysis (PCA)、t-Distributed Stochastic Neighbor Embedding (t-SNE)、Linear Discriminant Analysis (LDA)。
    • 示例:可视化高维数据、特征选择。
  5. 模型选择 (Model Selection)

    • 目标:选择最佳的模型和调参。
    • 工具:Grid Search、Random Search、Cross Validation、Metrics(如精度、召回率、F1 分数)。
    • 示例:寻找最佳的超参数组合以提高模型性能。
  6. 数据预处理 (Data Preprocessing)

    • 目标:处理和转换数据以便于机器学习模型使用。
    • 功能:标准化、归一化、缺失值处理、特征选择、特征提取、编码分类特征。
    • 示例:将文本数据转化为数值数据、处理缺失值。

安装

Scikit-learn 可以通过 Python 的包管理工具 pip 安装:

pip install scikit-learn

主要模块

  1. sklearn.datasets:提供各种机器学习数据集(如 iris, digits, wine, boston)。
  2. sklearn.model_selection:用于模型选择和评估(如 train_test_split, GridSearchCV, cross_val_score)。
  3. sklearn.preprocessing:用于数据预处理(如 StandardScaler, OneHotEncoder, Imputer)。
  4. sklearn.feature_selection:用于特征选择(如 SelectKBest, RFE)。
  5. sklearn.decomposition:用于降维(如 PCA, NMF)。
  6. sklearn.metrics:用于评估模型性能(如 accuracy_score, confusion_matrix, roc_auc_score)。
  7. sklearn.pipeline:用于创建和管理机器学习流程(如 Pipeline, FeatureUnion)。

示例

分类示例:使用支持向量机进行分类
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import classification_report# 载入数据
iris = datasets.load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 训练模型
model = SVC(kernel='linear')
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 评估
print(classification_report(y_test, y_pred))
回归示例:使用线性回归进行预测
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 载入数据
boston = datasets.load_boston()
X, y = boston.data, boston.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 训练模型
model = LinearRegression()
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 评估
mse = mean_squared_error(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")

资源和文档

  • 官方网站: Scikit-learn
  • 用户指南: User Guide
  • API 文档: API Reference
  • 示例代码: Examples

二.loc和iloc区别

  • lociloc 是 Pandas 库中用于索引和切片 DataFrame 的两种重要方法。它们都用于访问 DataFrame 的行和列,但它们的工作方式有所不同:

1. loc 用法

  • 基于标签(Label-based)loc 是通过行和列的标签(即索引名称和列名)进行数据选择的。
  • 使用行/列的标签
  • 可以同时使用布尔数组进行过滤
基本用法示例:
import pandas as pd# 创建一个示例DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],'Age': [24, 27, 22, 32],'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}df = pd.DataFrame(data)# 使用loc选择一行(根据标签)
row_1 = df.loc[1]  # 获取标签为1的行
print(row_1)# 使用loc选择多行多列
rows_cols = df.loc[1:3, ['Name', 'City']]  # 获取标签为1到3的行,且只取Name和City列
print(rows_cols)# 使用布尔条件选择行
rows_condition = df.loc[df['Age'] > 25, ['Name', 'City']]  # 获取Age大于25的行,且只取Name和City列
print(rows_condition)

2. iloc 用法

  • 基于整数位置(Integer-location based)iloc 是通过行和列的整数位置(即索引位置)进行数据选择的。
  • 使用整数索引
  • 同样支持切片操作
基本用法示例:
import pandas as pd# 创建一个示例DataFrame
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David'],'Age': [24, 27, 22, 32],'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
}df = pd.DataFrame(data)# 使用iloc选择一行(根据整数位置)
row_1 = df.iloc[1]  # 获取第1行
print(row_1)# 使用iloc选择多行多列
rows_cols = df.iloc[1:3, 0:2]  # 获取第1到第2行(不包含第3行),且只取第0到第1列
print(rows_cols)# 使用iloc切片选择行和列
slice_rows_cols = df.iloc[:, 1:3]  # 获取所有行,并取第1到第2列(不包含第3列)
print(slice_rows_cols)

3. lociloc 的对比

  • loc 通过标签进行索引,适用于当你知道具体的行标签或列名时使用。
  • iloc 通过整数位置进行索引,适用于按位置进行索引时使用。
示例对比:

假设你有以下 DataFrame:

import pandas as pddata = {'A': [1, 2, 3, 4],'B': [5, 6, 7, 8],'C': [9, 10, 11, 12]
}df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
  • 使用 loc

    result_loc = df.loc['b':'d', ['A', 'C']]  # 通过标签选择 'b' 到 'd' 行,和 'A'、'C' 列
    print(result_loc)
    
  • 使用 iloc

    result_iloc = df.iloc[1:4, [0, 2]]  # 通过位置选择第1到第3行(不含第4行),和第0、2列
    print(result_iloc)
    

三.Pandas 数据结构 - DataFrame

DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。

DataFrame 特点:

  • 列和行: DataFrame 由多个列组成,每一列都有一个名称,可以看作是一个 Series。同时,DataFrame 有一个行索引,用于标识每一行。
  • 二维结构: DataFrame 是一个二维表格,具有行和列。可以将其视为多个 Series 对象组成的字典。
  • 列的数据类型: 不同的列可以包含不同的数据类型,例如整数、浮点数、字符串等。

DataFrame 构造方法如下:

pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)。
  • index:索引值,或者可以称为行标签。
  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
  • dtype:数据类型。
  • copy:拷贝数据,默认为 False。

Pandas DataFrame 是一个二维的数组结构。

使用列表创建

import pandas as pd
data = [['karen', 10], ['jack', 12], ['marry', 13]]
# 创建DataFrame
df = pd.DataFrame(data, columns=['name', 'age'])
print(df)
结果:name  age
0  karen   10
1   jack   12
2  marry   13

使用字典/列表来创建:

import pandas as pd
data = {'name':['karen', 'jack', 'marry'], 'age':[10, 12, 13]}
df = pd.DataFrame(data)
print (df)

使用列表/字典创建,其中字典的 key 为列名没有对应的部分数据为NaN:

import pandas as pd
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print (df)

使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:

**注意:**返回结果其实就是一个 Pandas Series 数据。

import pandas as pd
data = {"calories": [420, 380, 390],"duration": [50, 40, 45]
}
# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)
# 返回第一行
print(df.loc[0])
# 返回第二行
print(df.loc[1])

也可以返回多行数据,使用 [[ 1,2,3… ]] 格式,1,2,3… 为各行的索引,以逗号隔开:

import pandas as pd
data = {"calories": [420, 380, 390],"duration": [50, 40, 45]
}
# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)
# 返回第一行和第二行
print(df.loc[[0, 1]])

指定行索引值

import pandas as pd
data = {"calories": [420, 380, 390],"duration": [50, 40, 45]
}
df = pd.DataFrame(data, index = ["day1", "day2", "day3"])
print(df)
print(df.loc["day2"])

四.DictVectorizer–将字典转换为特征向量

  • DictVectorizerscikit-learn 中的一个用于将字典(或类似的映射对象)转换为特征向量的工具类。它常用于处理字典格式的特征,特别是当特征是类别变量时。下面是 DictVectorizer 类的参数及其详细解释。

DictVectorizer 的参数

from sklearn.feature_extraction import DictVectorizervectorizer = DictVectorizer(sparse=True, sort=True, dtype=<class 'numpy.float64'>)
1. sparse
  • 描述: 指定输出是否为稀疏矩阵格式。当数据中包含大量零时,稀疏矩阵可以显著减少内存消耗。
  • 类型: bool
  • 默认值: True
  • 详细解释:
    • sparse=True 时,输出为 scipy.sparse 的稀疏矩阵格式(例如 csr_matrix)。
    • sparse=False 时,输出为 NumPy 数组。
  • 示例:
    vectorizer = DictVectorizer(sparse=False)
    
2. sort
  • 描述: 指定是否对特征名称按字典顺序进行排序。排序后的特征名称在特征矩阵中列的顺序是固定的,这在调试和结果解释时可能有用。
  • 类型: bool
  • 默认值: True
  • 详细解释:
    • sort=True 时,特征名称按字母顺序排序。
    • sort=False 时,特征名称的顺序是其在字典中首次出现的顺序。
  • 示例:
    vectorizer = DictVectorizer(sort=False)
    
3. dtype
  • 描述: 输出特征矩阵的元素的数据类型。
  • 类型: dtype
  • 默认值: numpy.float64
  • 详细解释:
    • 你可以指定 dtype 为任何 NumPy 数据类型,如 numpy.float32numpy.int64
    • 在处理大规模数据或对内存要求较高的情况下,可能会选择较低精度的 dtype(如 float32)来节省内存。
  • 示例:
    vectorizer = DictVectorizer(dtype=numpy.float32)
    

示例代码

下面是使用 DictVectorizer 的一个示例,展示了如何将字典格式的数据转换为特征向量:

from sklearn.feature_extraction import DictVectorizer# 创建DictVectorizer对象
vectorizer = DictVectorizer(sparse=False)# 示例字典数据
data = [{'city': 'New York', 'temperature': 21},{'city': 'San Francisco', 'temperature': 15},{'city': 'New York', 'temperature': 22},
]# 进行转换
X = vectorizer.fit_transform(data)# 输出转换后的特征向量
print(X)# 输出特征名称
print(vectorizer.get_feature_names_out())

输出

[[ 0.  1. 21.][ 1.  0. 15.][ 0.  1. 22.]]
['city=New York', 'city=San Francisco', 'temperature']

解释

  • 稀疏矩阵 (sparse=True): 在稀疏格式下,矩阵中多数为零的元素不会存储,节省了大量的内存。
  • 排序 (sort=True): 确保特征名称按字典顺序排列,提供一致的特征排列顺序。
  • 数据类型 (dtype): 控制输出矩阵的数据类型,可以根据内存需求调整。

使用 DictVectorizer,类别变量会被转换为 one-hot 编码,并与其他数值特征一同表示为数值矩阵.

示例代码:使用 DictVectorizer 将类别变量和数值变量转换为特征向量

from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 示例字典数据
data = [{'city': 'New York', 'temperature': 21, 'humidity': 65},{'city': 'San Francisco', 'temperature': 15, 'humidity': 75},{'city': 'New York', 'temperature': 22, 'humidity': 70},{'city': 'Boston', 'temperature': 18, 'humidity': 60},{'city': 'Boston', 'temperature': 19, 'humidity': 68},{'city': 'San Francisco', 'temperature': 14, 'humidity': 80},
]# 对应的标签(比如,是否会下雨)
labels = [0, 1, 0, 0, 1, 1]# 创建 DictVectorizer 对象
vectorizer = DictVectorizer(sparse=False)# 将字典数据转换为特征矩阵
X = vectorizer.fit_transform(data)# 输出转换后的特征矩阵和特征名称
print("特征矩阵:\n", X)
print("特征名称:\n", vectorizer.get_feature_names_out())# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.3, random_state=42)# 使用简单的决策树分类器进行训练
clf = DecisionTreeClassifier()
clf.fit(X_train, y_train)# 预测测试集
y_pred = clf.predict(X_test)# 评估模型的准确性
accuracy = accuracy_score(y_test, y_pred)
print("模型准确率:", accuracy)
关键字:01-机器学习--Scikit-learn

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: