无 在 Python 中运行 streamlit 时出现类型错误

Posted

技术标签:

【中文标题】无 在 Python 中运行 streamlit 时出现类型错误【英文标题】:None Type error in Python when running streamlit 【发布时间】:2022-01-04 02:20:01 【问题描述】:

您好,我正在尝试在 python 中创建一个应用程序,允许用户选择他们想要在 SK-Learn 库中的三个开源数据之一上实现的分类模型代码如下:

import streamlit as st
import numpy as np
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier


st.title("Streamlit example")

st.write("""
# Explore different classifier
which one is the best?
""")

dataset_name = st.sidebar.selectbox("Select Dataset", ("Iris","Breast Cancer","Wine Dataset") )

classifier_name  = st.sidebar.selectbox("Select Classifier", ("KNN","SVM","Random Forest") )

def get_dataset(dataset_name):
    if dataset_name == "Iris":
        data = datasets.load_iris()

    elif dataset_name == "Breast Cancer":
        data = datasets.load_breast_cancer()
    else:
        data = datasets.load_wine()

    X = data.data
    y = data.target
    return X, y

X, y  = get_dataset(dataset_name)

st.write("Shape of datset", X.shape)
st.write("Number of classes", len(np.unique(y)))

def add_parameter_ui(clf_name):
    params = dict()
    if clf_name =="KNN":
        K = st.sidebar.slider("K",1,15)
        params["K"] = K
    elif clf_name =="SVM":
        C = st.sidebar.slider("C", 0.01,10.0)
        params["C"] = C
    else:
        max_depth = st.sidebar.slider("max_depth", 2,15)
        n_estimators = st.sidebar.slider("n_estimators",1,100)
        params["max_depth"]= max_depth
        params["n_estimators"] = n_estimators
        return params


params = add_parameter_ui(classifier_name)

def get_classifier(clf_name,params):
    
    if clf_name == "KNN":
        clf = KNeighborsClassifier(n_neighbors=params['K'])
       
    elif clf_name == "SVM":
        clf = SVC(C= params['C'])
 
    else:
        clf = RandomForestClassifier(n_estimators=params["n_estimators"],max_depth=params["max_depth"],random_state=1234)


    return clf

clf = get_classifier(classifier_name,params)

错误是:

   clf = KNeighborsClassifier(n_neighbors=params['K'])
TypeError: 'NoneType' object is not subscriptable

我知道该错误应该是不言自明的,但我尝试声明 clf = None,但仍然收到相同的错误,我要求有人将我引向正确的方向。

【问题讨论】:

您的数据是否包含任何nullNone 值? 你能添加完整的TracebackError 【参考方案1】:

问题出在您的 add_parameter_ui 函数中。在 clf_name 是 KNN 或 SVM 的情况下,您没有返回值,这会导致主代码中的 params 为 None 因此调用 params['K'] 不是因为 'NoneType' 对象不可下标。

这里是固定代码:

def add_parameter_ui(clf_name):
    params = dict()
    if clf_name =="KNN":
        K = st.sidebar.slider("K",1,15)
        params["K"] = K
        return params
    elif clf_name =="SVM":
        C = st.sidebar.slider("C", 0.01,10.0)
        params["C"] = C
        return params
    # If Random Forest
    max_depth = st.sidebar.slider("max_depth", 2,15)
    n_estimators = st.sidebar.slider("n_estimators",1,100)
    params["max_depth"]= max_depth
    params["n_estimators"] = n_estimators
    return params

【讨论】:

以上是关于无 在 Python 中运行 streamlit 时出现类型错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python在streamlit应用程序中打开atoti链接?

Python Streamlit - 过滤熊猫数据框而不重新运行整个脚本

如何在虚拟 conda 环境中设置 streamlit 的路径

通过docker运行时无法在浏览器中查看streamlit应用程序

Windows 7 64 位上的 streamlit 安装错误

在Streamlit中使用Python选择任何小部件后如何停止重新加载页面