本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj
提取码:mnsj
-
前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis
根据《Python for Data Analysis 3rd Edition》翻译整理
—————————————————–
scikit-learn
(https://scikit-learn.org/) 是使用最广泛、最值得信赖的通用Python机器学习库之一。它包含了广泛的标准监督和无监督机器学习方法,以及用于模型选择和评估、数据转换、数据加载和模型持久化的工具。这些模型可用于分类、聚类、预测和其他常见任务。
可以使用
conda
安装scikit-learn
:conda install scikit-learn
。
在学习机器学习以及如何应用scikit-learn
等库来解决实际问题方面,有很好的在线和图书资源。在本文中,只是简要介绍scikit-learn
的API风格。近年来,scikit-learn
和pandas
的集成已经有了很大的改进。
本文使用的数据集为Kaggle竞赛的关于1912年泰坦尼克号上生还乘客的经典数据集(https://www.kaggle.com/c/titanic) 。
在统计学和机器学习这样的例子中,一个典型的任务是根据数据中的特征来预测一个乘客是否会存活。在训练数据集(titanic_train.csv
)上拟合一个模型,然后在样本外的测试数据集(titanic_test.csv
)上进行评估。
1.加载数据集:
首先使用pandas分别加载训练数据集和测试数据集:
1# 加载训练数据集
2>>> train = pd.read_csv('./data/titanic_train.csv')
3
4# 加载测试数据集
5>>> test = pd.read_csv('./data/titanic_test.csv')
6
7>>> train.head(4)
2.数据预处理:
像statsmodels
和scikit-learn
这样的库一般不能输入缺失数据,所以需要检查各列,看看是否包含缺失数据。
1>>> train.isna().sum()
2PassengerId 0
3Survived 0
4Pclass 0
5Name 0
6Sex 0
7Age 177
8SibSp 0
9Parch 0
10Ticket 0
11Fare 0
12Cabin 687
13Embarked 2
14dtype: int64
15
16>>> test.isna().sum()
17PassengerId 0
18Pclass 0
19Name 0
20Sex 0
21Age 86
22SibSp 0
23Parch 0
24Ticket 0
25Fare 1
26Cabin 327
27Embarked 0
28dtype: int64
如果需要使用 Age
作为预测因子,但是它有缺失数据。因此首先需要进行缺失数据插补(imputation
),本次仅做一个简单的插补——用训练数据集的中位数来填补空值。
1>>> impute_value = train['Age'].median()
2
3>>> train['Age'] = train['Age'].fillna(impute_value)
4
5>>> test['Age'] = test['Age'].fillna(impute_value)
然后再添加了一列 IsFemale
作为'Sex'
列的编码版本。
1>>> train['IsFemale'] = (train['Sex'] == 'female').astype(int)
2
3>>> test['IsFemale'] = (test['Sex'] == 'female').astype(int)
4
5>>> train
然后决定一些模型变量并创建NumPy数组。
1>>> predictors = ['Pclass', 'IsFemale', 'Age']
2
3>>> X_train = train[predictors].to_numpy()
4
5>>> X_test = test[predictors].to_numpy()
6
7>>> y_train = train['Survived'].to_numpy()
使用scikit-learn
的LogisticRegression
模型并创建一个模型实例(该模型仅为实例,不代表是一个合适的模型,同时前面选取的特征也不一定是最正确的)。
1>>> from sklearn.linear_model import LogisticRegression
2
3>>> model = LogisticRegression()
我们可以使用模型的 fit
方法在训练数据上拟合模型。
1>>> model.fit(X_train, y_train)
现在,我们可以使用model.predict
对测试数据集进行预测。
1>>> y_predict = model.predict(X_test)
2>>> y_predict[:10]
3array([0, 0, 0, 0, 1, 0, 1, 0, 1, 0], dtype=int64)
此时,如果你有测试数据集的真实值,你可以计算出准确率百分比或其他一些误差指标。
1(y_true == y_predict).mean()
4.交叉验证法:
在实践中,许多模型都有可以调整的参数。有一些可以用来调整参数的技术(如交叉验证法)以避免对训练数据的过度拟合,这通常可以使得模型在新的数据上产生更好的预测性能或稳健性。
交叉验证的工作原理是通过分割训练数据来模拟样本外的预测,基于像均方误差这样的模型精度分数,可以对模型参数进行网格搜索。诸如逻辑回归这样的模型有内置交叉验证的估计器类。
例如,LogisticRegressionCV
类可以与一个参数一起使用,该参数表示网格搜索在模型正则化参数C
上的细致度。
1>>> from sklearn.linear_model import LogisticRegressionCV
2
3>>> model_cv = LogisticRegressionCV(Cs=10)
4
5>>> model_cv.fit(X_train, y_train)
如果需要手工进行交叉验证,可以使用 cross_val_score
辅助函数,它用于处理数据拆分过程。例如,为了用练数据的四个非重叠分割进行交叉验证,可以采用如下方式。
1>>> from sklearn.model_selection import cross_val_score
2
3>>> model = LogisticRegression(C=10)
4
5>>> scores = cross_val_score(model, X_train, y_train, cv=4)
6
7>>> scores
8array([0.77578475, 0.79820628, 0.77578475, 0.78828829])
默认的评分指标与模型有关,但也可以选择一个明确的评分函数。交叉验证的模型需要更长的时间来训练,但往往可以产生更好的模型性能。
本篇文章来源于微信公众号: 码农设计师