############数据探索(利用逻辑回归来探索标签与特征的关系)######## midwest[midwest['area']>0.1] midwest['category'].value_counts()
分别运行的结果如下:
midwest['c1'] =midwest['category'].apply(lambda x:x[0]) midwest['c2'] =midwest['category'].apply(lambda x:x[1]) midwest['c3'] =midwest['category'].apply(lambda x:x[2]) midwest.head() #利用的正则化的表达式
##########利用机器学习算法来验证自己的想法########### #######处理数据集,将最后三个字母转化为数字######### #######可以采用独热编码############################# from sklearn.preprocessing import OrdinalEncoder as OE data=midwest.copy() data.head() data.iloc[:,-3:].head() data.head() ###将字母转化为数字### data.iloc[:,-3:] =OE().fit_transform(data.iloc[:,-3:]) data.iloc[:,-3:].head()
这是将字母转化为数字后的
data.info()#查看数据类型
#去掉所有object对象的列,保留数字的列
data = data.loc[:,data.dtypes.values !='O']
###将所有类型的数转化为浮点数
for i in range(data.loc[:,data.dtypes.values =='int64'].shape[1]):
data.loc[i,data.dtypes.values=='int64']= data.loc[i,data.dtypes.values =='int64'].apply(lambda x:float(x))
data.info()
x=data.iloc[:,1:-3] ###特征矩阵 x.head()
y=data.iloc[:,-3:]## 所有行的,列是倒数3列的 y.head()
##############分测试集与训练集###########
from sklearn.model_selection import train_test_split as TTS
Xtrain,Xtest,ytrain,ytest = TTS(x,y,test_size=0.3,random_state=420)
##############恢复索引###################
for i in [Xtrain,Xtest,ytrain,ytest]:
i.index =range(i.shape[0])
##############标准化###################
###iloc的学习####
Xtrain.iloc[:,[0,2,4,6]]#######取出0,2,4,6的列
[*range(23),-1]
Xtrain.iloc[:,[*range(23),-1]].head() #0到22列以及最后一列跳过中间的一列
###标准化数据集#### from sklearn.preprocessing import StandardScaler ss = StandardScaler().fit(Xtrain.iloc[:,[*range(23),-1]].head()) #以训练集为标准的均值与方差 xtrain_ =Xtrain.copy() xtest_ = Xtest.copy() xtrain_.iloc[:,[*range(23),-1]]=ss.transform(Xtrain.iloc[:,[*range(23),-1]]) xtest_.iloc[:,[*range(23),-1]]=ss.transform(Xtest.iloc[:,[*range(23),-1]]) xtrain_.head()
##############分测试集与训练集###########
from sklearn.model_selection import train_test_split as TTS
Xtrain,Xtest,ytrain,ytest = TTS(x,y,test_size=0.3,random_state=420)
##############恢复索引###################
for i in [Xtrain,Xtest,ytrain,ytest]:
i.index =range(i.shape[0])
##############标准化###################
from sklearn.preprocessing import StandardScaler
ss = StandardScaler().fit(Xtrain.iloc[:,[*range(23),-1]].head()) #以训练集为标准的均值与方差
xtrain_ =Xtrain.copy()
xtest_ = Xtest.copy()
xtrain_.iloc[:,[*range(23),-1]]=ss.transform(Xtrain.iloc[:,[*range(23),-1]])
xtest_.iloc[:,[*range(23),-1]]=ss.transform(Xtest.iloc[:,[*range(23),-1]])
######################使用逻辑回归进行建模##################
from sklearn.linear_model import LogisticRegression as logiR
#import pandas as pd
for i in range(3):
logi = logiR(solver='newton-cg',max_iter=100**20,multi_class='multinomial').fit(xtrain_,ytrain.iloc[:,i].ravel())
print(y.columns[i])
print('tTrain:{}'.format(logi.score(xtrain_,ytrain.iloc[:,i].ravel())))#模型的学习能力,以准确率来衡量
print('tTest:{}'.format(logi.score(xtrain_,ytrain.iloc[:,i].ravel())))#模型的泛化能力
coeff = pd.dataframe(logi.coef_).T #每行是我们的特征,每列是我们的三等类的三个系数(A,L,H)
if i !=2:
coeff['mean'] = coeff.iloc[:,: -1].mean(axis=1)
coeff['name'] = xtrain.columns
coeff.columns = ['Average','High','Low','mean','name']
else:
coeff['name'] = xtrain.columns
coeff.columns = ['Coef','mean']
print(coeff.sort_values(by='mean',ascending=False).head())#根据均值进行降序排列
print('t')
logi.coef_.shape ###
进行绘图
###丰富我们的图像
###预设图像的各种属性#####
large = 22 ;med = 16 ; small =12;
params = {'axes.titlesize':large, #子图上标题的大小
'legend.fontsiz':med, #图列的字体的大小
'figure.figsize':(16,10), #图像的画布的大小
'axes.labelsize': med, #标签的字体大小
'xtick.labelsize': med, #x轴上标尺的字体的大小
'ytick.labelsize': med, #y轴上标尺的字体的大小
'figure.titlesize': large #整个画布的标题字体大小
}
#plt.rcParams.update(params) #设置各种各样的默认属性
#plt.style.use('seaborn-whitegird')#设定各种风格有很多属性
sns.set_style('white')#设定背景风格
###准备标签和颜色列表
categories = np.unique(midwest['category'])
colors=[plt.cm.tab10(i/float(len(categories)-1))for i in range (len(categories))]
##########建立画布
plt.figure( figsize=(16,10), #绘图尺寸
dpi=80, #图像的分辩率
facecolor ='w', #图像的背景颜色,设置为白色,默认为白色
edgecolor ='k' #图像的背景颜色,设置为黑色,默认为黑色
)
##############循坏绘图
for i ,category in enumerate(categories):
plt.scatter('area','poptotal',
data=midwest.loc[midwest.category==category,:],
s=20,c=np.array(colors[i]).reshape(1,-1),label=str(category))
#注意到这里的数据或去方式和我们之前绘图的不一样了吗?
#我们不仅可以输入横纵坐标,也可以输入横纵坐标的名字,然后使用data这个参数来传入全数据集
#我们不仅可以循坏i,还可以对i和category一同循坏
#############对图像进行装饰############
#plt.gca() 获取当前的子图,如果当前没有子图的话,就帮我创建一个新的子图
plt.gca().set(xlim=(0.0,0.12),ylim=(0,80000))#控制横纵坐标的范围
plt.xticks(fontsize=12) #坐标轴上的尺寸的字的大小
plt.yticks(fontsize=12)
plt.ylabel('Population',fontsize=12)#坐标轴上的标题和字体的大小
plt.xlabel('Area',fontsize=22)
plt.title('scatterplot of Midwest Area vs Population',fontsize =22)#整个图像的标题和字体的大小
plt.legend(fontsize =12) #图例的字体的大小
###圈出高学历,地贫困的地方
plt.scatter( 'area','poptotal',
data=midwest.loc[midwest.category=='HLU',:],
s=300,
facecolors ='None', #点的填从颜色,为none的时候,表示点是透明的
edgecolors ='red', #点的边框呈现的是红色的
label = 'Selected'
)
####低学历,很贫困的地方
plt.scatter( 'area','poptotal',
data=midwest.loc[midwest.category=='LHR',:],
s=300,
facecolors ='None', #点的填从颜色,为none的时候,表示点是透明的
edgecolors ='blue', #点的边框呈现的是红色的
label = 'Selected'
)
####学历低,但很富有的地方
plt.scatter( 'area','poptotal',
data=midwest.loc[midwest.category=='HHR',:],
s=300,
facecolors ='None', #点的填从颜色,为none的时候,表示点是透明的
edgecolors ='green', #点的边框呈现的是红色的
label = 'Selected'
)
####图形的装饰#########
plt.gca().set(xlim=(0.0,0.12),ylim=(0,80000))#控制横纵坐标的范围
plt.xticks(fontsize=12) #坐标轴上的尺寸的字的大小
plt.yticks(fontsize=12)
plt.ylabel('Population',fontsize=12)#坐标轴上的标题和字体的大小
plt.xlabel('Area',fontsize=22)
plt.title('scatterplot of Midwest Area vs Population',fontsize =22)#整个图像的标题和字体的大小
plt.legend(fontsize =12) #图例的字体的大小
plt.show()



