01-机器学习--Scikit-learn

一.Scikit-learn介绍

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

安装

bash 复制代码
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 安装:

bash 复制代码
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)。

示例

分类示例:使用支持向量机进行分类
python 复制代码
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))
回归示例:使用线性回归进行预测
python 复制代码
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}")

资源和文档

二.loc和iloc区别

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

1. loc 用法

  • 基于标签(Label-based)loc 是通过行和列的标签(即索引名称和列名)进行数据选择的。
  • 使用行/列的标签
  • 可以同时使用布尔数组进行过滤
基本用法示例:
python 复制代码
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 是通过行和列的整数位置(即索引位置)进行数据选择的。
  • 使用整数索引
  • 同样支持切片操作
基本用法示例:
python 复制代码
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:

python 复制代码
import pandas as pd

data = {
    '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

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

    python 复制代码
    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 是一个二维的数组结构。

使用列表创建

python 复制代码
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

使用字典/列表来创建:

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

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

python 复制代码
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 数据。

python 复制代码
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... 为各行的索引,以逗号隔开:

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

指定行索引值

python 复制代码
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 的参数

python 复制代码
from sklearn.feature_extraction import DictVectorizer

vectorizer = DictVectorizer(sparse=True, sort=True, dtype=<class 'numpy.float64'>)
1. sparse
  • 描述: 指定输出是否为稀疏矩阵格式。当数据中包含大量零时,稀疏矩阵可以显著减少内存消耗。

  • 类型 : bool

  • 默认值 : True

  • 详细解释 :

    • sparse=True 时,输出为 scipy.sparse 的稀疏矩阵格式(例如 csr_matrix)。
    • sparse=False 时,输出为 NumPy 数组。
  • 示例 :

    python 复制代码
    vectorizer = DictVectorizer(sparse=False)
2. sort
  • 描述: 指定是否对特征名称按字典顺序进行排序。排序后的特征名称在特征矩阵中列的顺序是固定的,这在调试和结果解释时可能有用。

  • 类型 : bool

  • 默认值 : True

  • 详细解释 :

    • sort=True 时,特征名称按字母顺序排序。
    • sort=False 时,特征名称的顺序是其在字典中首次出现的顺序。
  • 示例 :

    python 复制代码
    vectorizer = DictVectorizer(sort=False)
3. dtype
  • 描述: 输出特征矩阵的元素的数据类型。

  • 类型 : dtype

  • 默认值 : numpy.float64

  • 详细解释 :

    • 你可以指定 dtype 为任何 NumPy 数据类型,如 numpy.float32numpy.int64
    • 在处理大规模数据或对内存要求较高的情况下,可能会选择较低精度的 dtype(如 float32)来节省内存。
  • 示例 :

    python 复制代码
    vectorizer = DictVectorizer(dtype=numpy.float32)

示例代码

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

python 复制代码
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())

输出

python 复制代码
[[ 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 将类别变量和数值变量转换为特征向量

python 复制代码
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)
相关推荐
游客5206 分钟前
opencv中的各种滤波器简介
图像处理·人工智能·python·opencv·计算机视觉
一位小说男主6 分钟前
编码器与解码器:从‘乱码’到‘通话’
人工智能·深度学习
深圳南柯电子22 分钟前
深圳南柯电子|电子设备EMC测试整改:常见问题与解决方案
人工智能
Kai HVZ23 分钟前
《OpenCV计算机视觉》--介绍及基础操作
人工智能·opencv·计算机视觉
biter008828 分钟前
opencv(15) OpenCV背景减除器(Background Subtractors)学习
人工智能·opencv·学习
吃个糖糖34 分钟前
35 Opencv 亚像素角点检测
人工智能·opencv·计算机视觉
qq_529025291 小时前
Torch.gather
python·深度学习·机器学习
IT古董1 小时前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
凯哥是个大帅比1 小时前
人工智能ACA(五)--深度学习基础
人工智能·深度学习