Python多项逻辑回归用LogisticRegression识别英文字母数据集letter-recognition.data

一. 数据集下载地址
letter-recognition.data
下载.data文件就好,数据集部分信息和数据集属性如下图
属性信息

二. 用pd.read_csv读取数据集,可以看到它有20000个字母样本,每个字母又有16个特征
读取数据集

三. 遇到的一些坑
train_test_split函数的基本用法是train_test_split(X,y,test_size, random_state),X是待划分的样本特征,在上面的图片里就是那16列数字特征;y是待划分的样本标签,在上面的图片里就是字母那列;test_size若在0~1之间,就是测试集占总样本数目之比;我这里设置的是train_size=0.8,表示训练集占总样本的80%,如果不设置默认是75%;
rondom_state就是设置随机数种子,如果是零,那么两次运行时划分的训练集和测试集是不同的,如果是一个正整数,那么两次运行时划分的训练集和测试集是相同的;正整数的选取笔者认为随机选取就好,比如4、35、77、124等等。选取一个正整数只是分配一个随机数起点,只对训练集和测试集的划分有影响,对模型的评价只有微乎其微的影响。
比如我设置random_state=77,前一百个预测结果是这样的:
在这里插入图片描述我再设置random_state=123,前一百个预测结果是这样的:
在这里插入图片描述
可以看到,不同的random_state值影响了训练集和测试集的划分,对模型评价几乎没有影响。此外模型的测试集不同,预测结果不同就是显而易见的。总之就是相同的random_state值下,两次运行的结果是一样的。而两次不同的random_state值,只是训练集和测试集不同。

四. 运行结果
结果
可以看到对测试集的预测结果返回的是一个ndarray属性的列表,长度为4000。评分是用了决定系数R²对回归模型进行评价,得分0.777不算低。

五. 完整代码

from sklearn.linear_model import LogisticRegression
import pandas as pd
from sklearn.model_selection import train_test_split

path='E:/Python_file/zuoye/letter-recognition.data' #数据集路径
Cname = ['字母','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'] #设置列名称
data=pd.read_csv(path,header=None,names=Cname)
data.index.name='index'     #datadrame结构的行索引与列索引名字
data.columns.name='columns' 
print(data)

X=data[data.columns[1:17]]  #提取特征值,不需要第一列的字母值
x_train,x_test,y_train,y_test=train_test_split(X,data["字母"],train_size=0.8,random_state=77)
#设置最大迭代次数为4000,默认为1000.不更改会出现警告提示
lr=LogisticRegression(max_iter=4000)
clm=lr.fit(x_train,y_train)  #输入训练集
print('对测试集的预测结果:')
#输出预测结果、预测结果的结构类型及尺寸
print(clm.predict(x_test),type(clm.predict(x_test)),clm.predict(x_test).shape) 
#
print('模型评分:'+ str(clm.score(x_test,y_test))) #用决定系数来打分

对模型打分score方法感兴趣的可以看这篇
Scikit-learn中,性能评估所用的score到底是个什么意思

猜你喜欢

转载自blog.csdn.net/kalakalabala/article/details/121169930