一.Scikit-learn介绍
- Scikit-learn(通常简称为
sklearn
)是一个用于机器学习和数据挖掘的 Python 库。它提供了大量的机器学习算法和工具,支持分类、回归、聚类、降维、模型选择和数据预处理等任务。Scikit-learn 的目标是提供一个简单、有效、易于使用的机器学习库,以便用户能够快速构建和评估模型。
安装
python -m pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple
主要功能和组件
-
分类 (Classification):
- 目标:预测离散标签或类别。
- 常用算法:Logistic Regression、K-Nearest Neighbors (KNN)、Support Vector Machines (SVM)、Decision Trees、Random Forest、Naive Bayes、Gradient Boosting、Neural Networks(MLP)。
- 示例:识别邮件是否为垃圾邮件,或预测某人是否会购买某个产品。
-
回归 (Regression):
- 目标:预测连续数值。
- 常用算法:Linear Regression、Ridge Regression、Lasso Regression、Support Vector Regression (SVR)、Decision Trees、Random Forests、Gradient Boosting.
- 示例:预测房价、股市价格或温度。
-
聚类 (Clustering):
- 目标:将数据分组为不同的簇或类别。
- 常用算法:K-Means、DBSCAN、Agglomerative Clustering、Mean Shift、Spectral Clustering。
- 示例:客户细分、图像分割。
-
降维 (Dimensionality Reduction):
- 目标:减少数据的特征数量,同时尽可能保留数据的结构和信息。
- 常用算法:Principal Component Analysis (PCA)、t-Distributed Stochastic Neighbor Embedding (t-SNE)、Linear Discriminant Analysis (LDA)。
- 示例:可视化高维数据、特征选择。
-
模型选择 (Model Selection):
- 目标:选择最佳的模型和调参。
- 工具:Grid Search、Random Search、Cross Validation、Metrics(如精度、召回率、F1 分数)。
- 示例:寻找最佳的超参数组合以提高模型性能。
-
数据预处理 (Data Preprocessing):
- 目标:处理和转换数据以便于机器学习模型使用。
- 功能:标准化、归一化、缺失值处理、特征选择、特征提取、编码分类特征。
- 示例:将文本数据转化为数值数据、处理缺失值。
安装
Scikit-learn 可以通过 Python 的包管理工具 pip
安装:
pip install scikit-learn
主要模块
sklearn.datasets
:提供各种机器学习数据集(如iris
,digits
,wine
,boston
)。sklearn.model_selection
:用于模型选择和评估(如train_test_split
,GridSearchCV
,cross_val_score
)。sklearn.preprocessing
:用于数据预处理(如StandardScaler
,OneHotEncoder
,Imputer
)。sklearn.feature_selection
:用于特征选择(如SelectKBest
,RFE
)。sklearn.decomposition
:用于降维(如PCA
,NMF
)。sklearn.metrics
:用于评估模型性能(如accuracy_score
,confusion_matrix
,roc_auc_score
)。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区别
loc
和iloc
是 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. loc
与 iloc
的对比
loc
通过标签进行索引,适用于当你知道具体的行标签或列名时使用。iloc
通过整数位置进行索引,适用于按位置进行索引时使用。
示例对比:
假设你有以下 DataFrame:
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
: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
–将字典转换为特征向量
DictVectorizer
是scikit-learn
中的一个用于将字典(或类似的映射对象)转换为特征向量的工具类。它常用于处理字典格式的特征,特别是当特征是类别变量时。下面是DictVectorizer
类的参数及其详细解释。
DictVectorizer
的参数
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 数组。
- 当
- 示例:
vectorizer = DictVectorizer(sparse=False)
2. sort
- 描述: 指定是否对特征名称按字典顺序进行排序。排序后的特征名称在特征矩阵中列的顺序是固定的,这在调试和结果解释时可能有用。
- 类型:
bool
- 默认值:
True
- 详细解释:
- 当
sort=True
时,特征名称按字母顺序排序。 - 当
sort=False
时,特征名称的顺序是其在字典中首次出现的顺序。
- 当
- 示例:
vectorizer = DictVectorizer(sort=False)
3. dtype
- 描述: 输出特征矩阵的元素的数据类型。
- 类型:
dtype
- 默认值:
numpy.float64
- 详细解释:
- 你可以指定
dtype
为任何 NumPy 数据类型,如numpy.float32
或numpy.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)