机器学习项目实战

1.数据准备

数据集地址:https://www.kaggle.com/c/titanic/data
项目完整代码及数据网盘地址:https://pan.baidu.com/s/1nN3508FF5gWuhatK5j6luQ
提取码:elfu
算法:逻辑回归
技术框架:python3.6.9+numpy1.18.1+pandas1.0.1+sklearn0.22.2+matplotlib2.2.4

2.数据加载及处理

1.加载结构化的训练集

import pandas as pd
data=pd.read_csv("train.csv")
#查看下数据样式
print(data.shape)
print(data.head())
#查看下数据的信息
print(data.info())  #data.describe()

字段信息如下:
PassengerId,乘客的ID
Survived,是否幸存标记0,1survived
Pclass,乘客船票等级1,2,3
Name,乘客姓名
Sex,性别
Age,年龄
SibSp,兄弟姐妹数
Parch,父母孩子数
Ticket,船票信息
Fare,船票价格
Cabin,船舱信息
Embarked,登陆港口
共891个样本,12个维度

各个字段的信息如下:
在这里插入图片描述
Age字段有部分缺失值,可以填充这部分缺失值
Cabin缺失值太多,无法处理,直接删除
Embarked有两个缺失值,可以直接删掉这两个样本
PassengerId为乘客的Id,显然对是否幸存无影响,通过相关系数分析或者卡方检验可以得出结果
在这里插入图片描述
Name 乘客姓名类似于Id,对预测也无影响,仅是区别乘客
Ticket票据的信息对预测也无影响

2.处理缺失值,异常值

#删除无用的维度
data.drop(["PassengerId","Cabin","Name","Ticket"],axis=1,inplace=True)
#删除Embarked缺失的样本
data=data.loc[data["Embarked"].notnull(),:]
#用均值填充Age字段的缺失值
age=data["Age"]
mean=age.mean() #Series对象自动忽略缺失值
data["Age"]=age.fillna(mean)
#再次看下数据
print(data.info())

在这里插入图片描述
此时数据只有889个样本,8个维度,均没有缺失值了,但是还有点问题,就是数据类型不一致,还需要进一步处理。

#选择object数据类型,编码转换,否则无法使用算法建模
df1=data.select_dtypes(include=["object"])
df2=data.select_dtypes(include=["int64","float64"])
print(df1.head())
print(df2.head())

在这里插入图片描述
可以看到Sex,Embarked两个字段的数据还不是数值类型,模型还不能使用,所以需要转换,这里采用pandas哑编码

#编码Sex
df_sex=pd.get_dummies(df1["Sex"],prefix="sex")
#编码Embarked
df_embarked=pd.get_dummies(df1["Embarked"],prefix="embarked")
df1=pd.concat([df_sex,df_embarked],axis=1)
print(df1.head())

在这里插入图片描述
最后获取总的数值类型的数据帧

df=pd.concat([df1,df2],axis=1).astype("float64")
print(df.head())

在这里插入图片描述
到这里就得到一个数据帧df,889个样本,11个维度,全部为float64类型的数据
通过相关系数分析,这11个维度都与是否幸存相关,如下:
在这里插入图片描述
当然也可以通过卡方检验,互信息等分析方法进行分析。
通过简单分析可知基本没有异常值,保留当前所有的样本

3.特征工程

特征工程其实也就是一些特征数据的处理,特征的选择,新特征的构造等,在第二步中也基本处理的差不多了 。这里只简单的归一化数据特征,方便模型算法的快速收敛

#这里使用手动的方式进行归一化,当然使用sklearn的preprocessing 进行归一化更便捷
#获取目标值
y=df.pop("Survived").values
#获取数据值
x=df.values
#训练数据的均值
x_mean=np.mean(x,axis=0)
x_std=np.std(x,axis=0)
x=(x-x_mean)/x_std

这里的归一化使用numpy手动处理,重在理解原理,项目源代码中使用的sklearn库处理,重在便捷

4.逻辑回归算法训练模型

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=3,shuffle=True)
gs=GridSearchCV(LogisticRegression(),[{"C":np.linspace(0.05,1.5,30),"penalty":["l2"],"solver":["lbfgs"]}],cv=10)
gs.fit(x_train,y_train)
#经过网格搜索超参数,得到一个针对当前训练集最优化的逻辑回归模型
estimator=gs.best_estimator_

5.模型性能评估

使用上一步得到的模型,拟合x_train,y_train,查看其学习曲线如下:
在这里插入图片描述
因为是二元分类,还可以看下其ROC曲线,如下:
在这里插入图片描述
综上可以看出模型性能还不错,acc,auc 均在0.8,后续就看通过一些特征工程的技巧或者选择其他的算法,还能不能进一步提升模型的性能,也就是模型的优化工作。

6.模型持久化

如果模型的性能满足我们的需求了,那就要把模型固化存储起来,方便上线部署使用。
这里分sklearn的不同版本介绍两种模型持久化的方法

6.1 sklearn 0.21之前

#固化存储之前,模型重新拟合所有数据集,避免数据的浪费
estimator.fit(x,y)
from sklearn.externals import joblib
joblib.dump(estimator,"../model/titanic_lr.pkl")
#但是这种方法在sklearn 0.21及以后的版本已经抛弃了

6.2 sklearn 0.21之后

import joblib
joblib.dump(estimator,"../model/titanic_lr.gz")

好了,整个项目到这里就结束了,下面看看还能不能再优化一下吧。

  • 3
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
机器学习项目实战代码通常包括数据处理、模型训练和评估三个部分。以下是一个简单的例子,介绍了如何使用Python实现一个二分类模型。 1. 数据处理: 数据处理是机器学习项目中非常重要的一步,可以使用Pandas等数据处理库进行数据清洗、特征工程等操作。 ```python import pandas as pd import numpy as np # 读取数据 data = pd.read_csv('data.csv') # 数据清洗 data.dropna(inplace=True) # 特征工程 X = data.iloc[:, :-1] y = data.iloc[:, -1] ``` 2. 模型训练: 在模型训练之前,需要将数据集划分为训练集和测试集,并选择适当的模型和超参数。 ```python from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression # 划分数据集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 选择模型并训练 model = LogisticRegression() model.fit(X_train, y_train) ``` 3. 模型评估: 模型评估通常包括精度、召回率、F1值等指标,可以使用sklearn等库进行计算。 ```python from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 预测并评估模型 y_pred = model.predict(X_test) acc = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) print('Accuracy: {:.2f}%'.format(acc * 100)) print('Precision: {:.2f}%'.format(precision * 100)) print('Recall: {:.2f}%'.format(recall * 100)) print('F1 Score: {:.2f}%'.format(f1 * 100)) ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laufing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值