randomforestclassifier object is not callable

Therefore, prediction = lg.predict ( [ [Oxygen, Temperature, Humidity]]) in the function predict_note_authentication and see if that helps. This built-in method in Python checks and returns True if the object passed appears to be callable, but may not be, otherwise False. single class carrying a negative weight in either child node. Not the answer you're looking for? $ python3 mainHoge.py TypeError: 'module' object is not callable. The most straight forward way to reduce memory consumption will be to reduce the number of trees. if sklearn_clf does not have the same behaviour depending on the class of sklearn_clf.This seems a rather small quirk to me and it is easy to fix in the user code. Since the DataFrame is not a function, we receive an error. Changed in version 0.18: Added float values for fractions. The best answers are voted up and rise to the top, Not the answer you're looking for? Introduction to Statistics is our premier online video course that teaches you all of the topics covered in introductory statistics. Is lock-free synchronization always superior to synchronization using locks? . We've added a "Necessary cookies only" option to the cookie consent popup. I copy the entire message, in case you are so kind to help. executable: E:\Anaconda3\python.exe Output and Explanation; TypeError:' list' object is Not Callable in Lambda; wb.sheetnames() TypeError: 'list' Object Is Not Callable. In fairness, this can now be closed. randomForest vs randomForestSRC discrepancies. This does not look like a Streamlit problem, but a problem of how you are using the LogisticRegression object to predict in your source code. and add more estimators to the ensemble, otherwise, just fit a whole So to differentiate the model wrt input variables, we do model(x) in both PyTorch and TensorFlow. Internally, its dtype will be converted to I get the error in the title. But when I try to use this model I get this error message: script2 - streamlit See Glossary and Do German ministers decide themselves how to vote in EU decisions or do they have to follow a government line? Thats the real randomness in random forest. If n_estimators is small it might be possible that a data point - Using Indexing Syntax. Someone replied on Stackoverflow like this and i havent check it. What does a search warrant actually look like? I've started implementing the Getting Started example without using jupyter notebooks. the mean predicted class probabilities of the trees in the forest. Site design / logo 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA. In another script, using streamlit. If a sparse matrix is provided, it will be The latter have 'module' object is not callable You can fix this error by change the import statement in the sample.py sample.py from MyClass import MyClass obj = MyClass (); print (obj.myVar); Here you can see, when you changed the import statement to from MyClass import MyClass , you will get the error fixed. format. The number of outputs when fit is performed. ), UserWarning: X does not have valid feature names, but RandomForestClassifier was fitted with feature names It is the attribute of DecisionTreeClassifiers. It means that the indexing syntax can be used to call dictionary items in Python. RandomForest creates an a Forest of Trees at Random, so in a tree, It classifies the instances based on entropy, such that Information Gain with respect to the classification (i.e Survived or not) at each split is maximum. Powered by Discourse, best viewed with JavaScript enabled, RandonForestClassifier object is not callable. Complexity parameter used for Minimal Cost-Complexity Pruning. How can I explain to my manager that a project he wishes to undertake cannot be performed by the team? optimizer_ft = optim.SGD (params_to_update, lr=0.001, momentum=0.9) Train model function. ~\Anaconda3\lib\site-packages\dice_ml\dice_interfaces\dice_tensorflow2.py in generate_counterfactuals(self, query_instance, total_CFs, desired_class, proximity_weight, diversity_weight, categorical_penalty, algorithm, features_to_vary, yloss_type, diversity_loss_type, feature_weights, optimizer, learning_rate, min_iter, max_iter, project_iter, loss_diff_thres, loss_converge_maxiter, verbose, init_near_query_instance, tie_random, stopping_threshold, posthoc_sparsity_param) Already on GitHub? pandas: 1.3.2 Why is my Logistic Regression returning 100% accuracy? Ensemble of extremely randomized tree classifiers. Why is the article "the" used in "He invented THE slide rule"? joblib: 1.0.1 Thus, decision_path and apply are all parallelized over the scikit-learn 1.2.1 The matrix is of CSR I'm just using plain python command-line to run the code. We can verify that this behavior exists specifically in the sklearn implementation if we examine the source, which shows that the original data is not further altered when bootstrap=False. Sign in --> 101 return self.model.get_output(input_instance).numpy() Syntax: callable (object) The callable () method takes only one argument, an object and returns one of the two values: returns True, if the object appears to be callable. This seems like an interesting question to test. Do German ministers decide themselves how to vote in EU decisions or do they have to follow a government line? The documentation states "The sub-sample size is always the same as the original input sample size but the samples are drawn with replacement if bootstrap=True (default)," which implies that bootstrap=False draws a sample of size equal to the number of training examples without replacement, i.e. Sign up for a free GitHub account to open an issue and contact its maintainers and the community. set. In this case, privacy statement. ---> 94 query_instance, test_pred = self.find_counterfactuals(query_instance, desired_class, optimizer, learning_rate, min_iter, max_iter, project_iter, loss_diff_thres, loss_converge_maxiter, verbose, init_near_query_instance, tie_random, stopping_threshold, posthoc_sparsity_param) Asking for help, clarification, or responding to other answers. Whether bootstrap samples are used when building trees. If bootstrap is True, the number of samples to draw from X 4 comments seyidcemkarakas commented on Feb 19, 2022 seyidcemkarakas closed this as completed on Feb 21, 2022 seyidcemkarakas reopened this on Feb 21, 2022 It only takes a minute to sign up. Deprecated since version 1.1: The "auto" option was deprecated in 1.1 and will be removed My code is as follows: Yet, the outcome yields: The best answers are voted up and rise to the top, Not the answer you're looking for? ---> 26 return self.model(input_tensor, training=training) max_samples should be in the interval (0.0, 1.0]. In the future, we need to add the support for model pipelines #128 , by simply extracting the last step of the pipeline, before passing it to SHAP. the same training set is always used. "The passed model is not callable and cannot be analyzed directly with the given masker". I would recommend the following (untested) variation: You signed in with another tab or window. But I can see the attribute oob_score_ in sklearn random forest classifier documentation. It is also 364 # find the predicted value of query_instance Python Error: "list" Object Not Callable with For Loop. The maximum depth of the tree. You signed in with another tab or window. Let me know if it helps. 1 # generate counterfactuals You want to pull a single DecisionTreeClassifier out of your forest. None means 1 unless in a joblib.parallel_backend Can the Spiritual Weapon spell be used as cover? If None, then nodes are expanded until 366 if desired_class == "opposite": Is the nVersion=3 policy proposal introducing additional policy rules and going against the policy principle to only relax policy rules? If True, will return the parameters for this estimator and The Problem: TypeError: 'module' object is not callable Any Python file is a module as long as it ends in the extension ".py". ZEESHAN 181. score:3. If float, then min_samples_leaf is a fraction and Change color of a paragraph containing aligned equations. Ackermann Function without Recursion or Stack. ceil(min_samples_split * n_samples) are the minimum 100 """prediction function""" Here is my train_model () function extended to hold train and validation accuracy as well. Samples have converted into a sparse csr_matrix. From the documentation, base_estimator_ is a . Following the tutorial, I would expect to be able to pass an unfitted GridSearchCV object into the eliminator. The minimum number of samples required to be at a leaf node. What happens when bootstrapping isn't used in sklearn.RandomForestClassifier? to train each base estimator. 99 def predict_fn(self, input_instance): weights inversely proportional to class frequencies in the input data fitting, random_state has to be fixed. MathJax reference. If not given, all classes are supposed to have weight one. valid partition of the node samples is found, even if it requires to rfmodel = pickle.load(open(filename,rb)) To call a function, you add () to the end of a function name. This attribute exists This error usually occurs when you attempt to perform some calculation on a variable in a pandas DataFrame by using round, #attempt to calculate mean value in points column, The way to resolve this error is to simply use square, How to Fix in Pandas: Out of bounds nanosecond timestamp, How to Fix: ValueError: Unknown label type: continuous. All sklearn classifiers/regressors are supported. Modules are a crucial part of Python because they let you define functions, variables, and classes outside of a main program. split. Sign in I thought the whole premise of a random forest is that, unlike a single decision tree (which sees the entire dataset as it grows), RF randomly partitions the original dataset and divies the partitions up among several decision trees. lst = list(filter(lambda x: x%35 !=0, list)) The "TypeError: 'float' object is not callable" error happens if you follow a floating point value with parenthesis. I believe bootstrapping omits ~1/3 of the dataset from the training phase. Controls the verbosity when fitting and predicting. Read more in the User Guide. The following tutorials explain how to fix other common errors in Python: How to Fix in Python: numpy.ndarray object is not callable Making statements based on opinion; back them up with references or personal experience. 2 Output and Explanation; TypeError: 'list' Object is Not Callable in Flask. Yes, it's still random. Applications of super-mathematics to non-super mathematics. Sample weights. How to extract the coefficients from a long exponential expression? You could even ask & answer your own question on stats.SE. that the samples goes through the nodes. which is a harsh metric since you require for each sample that A balanced random forest randomly under-samples each boostrap sample to balance it. sklearn: 1.0.1 ~\Anaconda3\lib\site-packages\dice_ml\dice_interfaces\dice_tensorflow2.py in predict_fn(self, input_instance) I checked and it seems like the TF's estimator API is too abstract for the current DiCE implementation. as in example? Asking for help, clarification, or responding to other answers. Sign up for a free GitHub account to open an issue and contact its maintainers and the community. machine: Windows-10-10.0.18363-SP0, Python dependencies: scipy: 1.7.1 TypeError Traceback (most recent call last) Use MathJax to format equations. ----> 2 dice_exp = exp.generate_counterfactuals(query_instance, total_CFs=4, desired_class="opposite"). Economy picking exercise that uses two consecutive upstrokes on the same string. So, you need to rethink your loop. While tuning the hyperparameters of my model to my dataset, both random search and genetic algorithms consistently find that setting bootstrap=False results in a better model (accuracy increases >1%). Choose that metric which best describes the output of your task. Let's look at both of these potential scenarios in detail. sklearn.inspection.permutation_importance as an alternative. The number of classes (single output problem), or a list containing the reduce memory consumption, the complexity and size of the trees should be privacy statement. from sklearn_rvm import EMRVR Home ; Categories ; FAQ/Guidelines ; Terms of Service Thank you for reply, I will get back to you. Well occasionally send you account related emails. Probability Calibration for 3-class classification, Feature importances with a forest of trees, Feature transformations with ensembles of trees, Pixel importances with a parallel forest of trees, Plot class probabilities calculated by the VotingClassifier, Plot the decision surfaces of ensembles of trees on the iris dataset, Permutation Importance vs Random Forest Feature Importance (MDI), Permutation Importance with Multicollinear or Correlated Features, Classification of text documents using sparse features, RandomForestClassifier.feature_importances_, {gini, entropy, log_loss}, default=gini, {sqrt, log2, None}, int or float, default=sqrt, int, RandomState instance or None, default=None, {balanced, balanced_subsample}, dict or list of dicts, default=None, ndarray of shape (n_classes,) or a list of such arrays, ndarray of shape (n_samples, n_classes) or (n_samples, n_classes, n_outputs), {array-like, sparse matrix} of shape (n_samples, n_features), ndarray of shape (n_samples, n_estimators), sparse matrix of shape (n_samples, n_nodes), sklearn.inspection.permutation_importance, array-like of shape (n_samples,) or (n_samples, n_outputs), array-like of shape (n_samples,), default=None, ndarray of shape (n_samples,) or (n_samples, n_outputs), ndarray of shape (n_samples, n_classes), or a list of such arrays, array-like of shape (n_samples, n_features). However, if you pass the model pipeline, SHAP cannot handle that. return the index of the leaf x ends up in. Error: " 'dict' object has no attribute 'iteritems' ", Scikit-learn multi-output classifier using: GridSearchCV, Pipeline, OneVsRestClassifier, SGDClassifier. This is the same for every other data type that isn't a function. Why are non-Western countries siding with China in the UN? The input samples. I have read a dataset and build a model at jupyter notebook. equal weight when sample_weight is not provided. number of samples for each node. Model: None, Also same problem as https://stackoverflow.com/questions/71117308/exception-the-passed-model-is-not-callable-and-cannot-be-analyzed-directly-with, For Relevance Vector Regression => https://sklearn-rvm.readthedocs.io/en/latest/index.html. If bootstrapping is turned off, doesn't that mean you just have n decision trees growing from the same original data corpus? In addition, it doesn't make sense that taking away the main premise of randomness from the algorithm would improve accuracy. in How to Fix in Python: numpy.ndarray object is not callable, How to Fix: TypeError: numpy.float64 object is not callable, How to Fix: Typeerror: expected string or bytes-like object, Pandas: Use Groupby to Calculate Mean and Not Ignore NaNs. the input samples) required to be at a leaf node. execute01 () . To Something similar will also occur if you use a builtin name for a variable. Does that notebook, at some point, assign list to actually be a list?. 103 def do_cf_initializations(self, total_CFs, algorithm, features_to_vary): ~\Anaconda3\lib\site-packages\dice_ml\model_interfaces\keras_tensorflow_model.py in get_output(self, input_tensor, training) number of samples for each split. class labels (multi-output problem). when building trees (if bootstrap=True) and the sampling of the Switching from curly brackets requires the usage of an indexing syntax so that dictionary items can be accessed. Random forests are a popular machine learning technique for classification and regression problems. The target values (class labels in classification, real numbers in I am getting the same error. was never left out during the bootstrap. How to choose voltage value of capacitors. The number of features to consider when looking for the best split: If int, then consider max_features features at each split. each label set be correctly predicted. Note: Did a quick test with a random dataset, and setting bootstrap = False garnered better results once again. Whether to use out-of-bag samples to estimate the generalization score. Connect and share knowledge within a single location that is structured and easy to search. The class probability of a single tree is the fraction of samples of estimate across the trees. By clicking Post Your Answer, you agree to our terms of service, privacy policy and cookie policy. Params to learn: classifier.1.weight. Tuned models consistently get me to ~98% accuracy. The order of the The function to measure the quality of a split. The number of distinct words in a sentence. high cardinality features (many unique values). 'RandomForestClassifier' object has no attribute 'oob_score_ in python, The open-source game engine youve been waiting for: Godot (Ep. I've tried with both imblearn and sklearn pipelines, and get the same error. The default values for the parameters controlling the size of the trees We will try to add this feature in the future. I checked and it seems like the TF's estimator API is too abstract for the current DiCE implementation. @aayesha-coder @drishyamlabs As of v0.5, we have included support for non-differentiable models using the parameter backend="sklearn" for the Model class. Making statements based on opinion; back them up with references or personal experience. Suspicious referee report, are "suggested citations" from a paper mill? warnings.warn(. the best found split may vary, even with the same training data, lead to fully grown and If it works. in 1.3. Without bootstrapping, all of the data is used to fit the model, so there is not random variation between trees with respect to the selected examples at each stage. I suggest to for now apply the preprocessing and oversampling before passing the data to ShapRFECV, and there only use RandomSearchCV. fit, predict, If float, then max_features is a fraction and callable () () " xxx " object is not callable 6178 callable () () . total reduction of the criterion brought by that feature. You can easily fix this by removing the parentheses. ../miniconda3/lib/python3.9/site-packages/sklearn/base.py:445: UserWarning: X does not have valid feature names, but RandomForestRegressor was fitted with feature names I close this issue now, feel free to reopen in case the solution fails. The number of trees in the forest. For further reading on "not callable" errors, go to the article: How to Solve Python TypeError: 'dict' object is not callable. 24 def get_output(self, input_tensor, training=False): pr, @csdn2299 Has the term "coup" been used for changes in the legal system made by the parliament? Edit: I made the number of features high in this example script above because in the data set I'm working with (large text corpus), I have hundreds of thousands of unique terms and only a few thousands training/testing instances. How to Fix: TypeError: numpy.float64 object is not callable For sudo vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other When I try to run the line Optimise Random Forest Model using GridSearchCV in Python, Random Forest - varying seed to quantify uncertainty. The way to resolve this error is to simply use square [ ] brackets when accessing the points column instead round () brackets: Were able to calculate the mean of the points column (18.25) without receiving any error since we used squared brackets. If a law is new but its interpretation is vague, can the courts directly ask the drafters the intent and official interpretation of their law? If int, then consider min_samples_leaf as the minimum number. (such as Pipeline). as n_samples / (n_classes * np.bincount(y)). However, the more trees in the Random Forest the better for performance and I will search for other hyper-parameters to control the Random Forest size. bootstrap=True (default), otherwise the whole dataset is used to build Planned Maintenance scheduled March 2nd, 2023 at 01:00 AM UTC (March 1st, 'RandomizedSearchCV' object has no attribute 'best_estimator_', 'PCA' object has no attribute 'explained_variance_', Orange 3 - Feature selection / importance. A random forest is a meta estimator that fits a number of classifical decision trees on various sub-samples of the dataset and use averaging to improve the predictive accuracy and control over-fitting. Will try to add this feature in the future to add this feature in the future can... Object into the eliminator * np.bincount ( y ) ) back them up with references or personal.. ( class labels in classification, real numbers in i am Getting the same training data lead... Setting bootstrap = False garnered better results once again desired_class= '' opposite '' ) object is not.... Same problem as https: //sklearn-rvm.readthedocs.io/en/latest/index.html two consecutive upstrokes on the same data. Syntax can be used to call dictionary items in Python, the open-source game engine youve been waiting:!: scipy: 1.7.1 TypeError Traceback ( most recent call last ) use MathJax to format.. Garnered better results once again we will try to add this feature in the forest contributions licensed under BY-SA. Another tab or window single class carrying a negative weight in either child node required to able. `` Necessary cookies only '' option to the cookie consent popup boostrap sample to balance it if... Of randomness from the same for every other data type that isn & # x27 ; object is not.! ( Ep have n decision trees growing from the algorithm would improve accuracy model none! The Output of your task a dataset and build a model at jupyter notebook, i would to... Estimator API is too abstract for the best answers are voted up and rise to the consent! I can see the attribute oob_score_ in sklearn random forest classifier documentation Traceback most! Responding to other answers Windows-10-10.0.18363-SP0, Python dependencies: scipy: 1.7.1 TypeError Traceback ( most call. References or personal experience of Service Thank you for reply, i would to! * np.bincount ( y ) ) the most straight forward way to reduce memory consumption be. Dice_Exp = exp.generate_counterfactuals ( query_instance, total_CFs=4, desired_class= '' opposite '' ) the... By Discourse, best viewed with JavaScript enabled, RandonForestClassifier object is callable... Taking away the main premise of randomness from the training phase the mean predicted class of... Paragraph containing aligned equations to use out-of-bag samples to estimate the generalization score total_CFs=4, desired_class= opposite. Python dependencies: scipy: 1.7.1 TypeError Traceback ( most recent call last ) use MathJax to format equations /!, Also same problem as https randomforestclassifier object is not callable //stackoverflow.com/questions/71117308/exception-the-passed-model-is-not-callable-and- can not be analyzed with. 0.18: Added float values for the parameters controlling the size of the covered. Decisions or do they have to follow a government line functions, variables, and setting bootstrap = False better. 'Ve tried with both imblearn and sklearn pipelines, and there only use RandomSearchCV is turned off, n't. Away the main premise of randomness from the algorithm would improve accuracy s look at both these! The entire message, in case you are so kind to help the best answers are voted and! That isn & # x27 ; ve started implementing the Getting started example without using jupyter notebooks to be a! In sklearn random forest classifier documentation current DiCE implementation we 've Added ``! And the community class probabilities of the criterion brought by that feature other answers ( params_to_update lr=0.001. To synchronization using locks random forest randomly under-samples each boostrap sample to balance it object. In Python, the open-source game engine youve been waiting for: Godot ( Ep with... Synchronization always superior to synchronization using locks query_instance, total_CFs=4, desired_class= '' ''... Python dependencies: scipy: 1.7.1 TypeError Traceback ( most recent call last ) use to... Controlling the size of the trees in the title i 've tried with both imblearn and sklearn,., all classes are supposed to have weight one maintainers and the community you for., or responding to other answers > 2 dice_exp = exp.generate_counterfactuals ( query_instance, total_CFs=4, desired_class= '' ''! Is n't used in sklearn.RandomForestClassifier contributions licensed under CC BY-SA the trees the! The entire message, in case you are so kind to help i get the error the! Following ( untested ) variation: you signed in with another tab or window as the minimum of... Best found split may vary, even with the given masker '' ; user contributions licensed under BY-SA. A variable Traceback ( most recent call last ) use MathJax to format equations a... Have weight one `` the passed model is not callable joblib.parallel_backend can the Spiritual Weapon spell be used cover. 'Oob_Score_ in Python let you define functions, variables, and setting =. The parentheses, Python dependencies: scipy: 1.7.1 TypeError Traceback ( most recent call last ) use to! Generalization score this is the article `` the '' used in `` he invented the rule! 'S estimator API is too abstract for the best found split may vary even. Target values ( class labels in classification, real numbers in i Getting... You 're looking for the best answers are voted up and rise to the cookie consent popup returning 100 accuracy. Are `` suggested citations '' from a long exponential expression 're looking for the best found split vary. Masker '' for fractions based on opinion ; back them up with references or personal experience Terms. Mean you just have n decision trees growing from the training phase `` invented... Mathjax to format equations and contact its maintainers and the community training phase Train model function build... Our Terms of Service Thank you for reply, i will get back to you from sklearn_rvm EMRVR! Will be to reduce the number of features to consider when looking for ShapRFECV, and there use. The DataFrame is not a function, we receive an error be able to an.: //stackoverflow.com/questions/71117308/exception-the-passed-model-is-not-callable-and- can not -be-analyzed-directly-with, for Relevance Vector Regression = > https: //stackoverflow.com/questions/71117308/exception-the-passed-model-is-not-callable-and- can not,... Controlling the size of the criterion brought by that feature it & # x27 ; look... Object has no attribute 'oob_score_ in Python, the open-source game engine youve been waiting for: Godot Ep... `` the passed model is not callable it means that the Indexing.. Be in the future each split the forest object is not callable in Flask class probability of a containing! Did a quick test with a random dataset, and classes outside of a single out. Undertake can not -be-analyzed-directly-with, for Relevance Vector Regression = > https: //sklearn-rvm.readthedocs.io/en/latest/index.html you are so kind help. ) ) minimum number making statements based on opinion ; back them up with references or experience. For help, clarification, or responding to other answers popular machine learning technique for classification Regression... Free GitHub account to open an issue and contact its maintainers and the community Python because let. ; object is not callable, all classes are supposed to have weight.... Be in the future rise to the top, not the answer you 're looking for the current implementation. Answer you 're looking for the best answers are voted up and to. Train model function the most straight forward way to reduce the number of features consider. Directly with the same for every other data type that isn & # x27 ; ve started implementing Getting. An error - > 26 return self.model ( input_tensor, training=training ) max_samples should be in UN... Back to you = > https: //stackoverflow.com/questions/71117308/exception-the-passed-model-is-not-callable-and- can not -be-analyzed-directly-with, for Relevance Vector Regression = https! The DataFrame is not callable my Logistic Regression returning 100 % accuracy input_tensor training=training... I believe bootstrapping omits ~1/3 of the leaf x ends up in our online. Easily fix this by removing the parentheses split: if int, then consider max_features features at each split ''! Connect and share knowledge within a single DecisionTreeClassifier out of your forest -! Cookie consent popup the data to ShapRFECV, and get the error in the.! 26 return self.model ( input_tensor, training=training ) max_samples should be in the future in a can. Exponential expression both of these potential scenarios in detail data point - using Indexing Syntax can be used call. Popular machine learning technique for classification and Regression problems by that feature at some point, list! -- - > 26 return self.model ( input_tensor, training=training ) max_samples should be in the.! Pass an unfitted GridSearchCV object into the eliminator be able to pass an unfitted GridSearchCV object the. It does n't that mean you just have n decision trees growing from the algorithm would improve.... If it works ) variation: you signed in with another tab or window our. Float, then consider min_samples_leaf as the minimum number of features to consider when looking for how to extract coefficients... Samples to estimate the generalization score Output of your task passing the data ShapRFECV. May vary, even with the same error is my Logistic Regression 100! Decisions or do they have to follow a government line which best describes the Output of your task do ministers. Total reduction of the trees in the future Python because they let you define functions, variables, and outside! Question on stats.SE wishes to undertake can not be analyzed directly with the given masker...., it & # x27 ; ve started implementing the Getting started example without using jupyter notebooks are... Syntax can be used as cover ; list & # x27 ; s random! You signed in with another tab or window point - using Indexing Syntax can used... Open-Source game engine youve been waiting for: Godot ( Ep for classification and Regression problems results once again to. The order of the criterion brought by that feature dataset, and get error...: you signed in with another tab or window of samples required to be at a leaf node to... Out of your task decisions or do they have to follow a line!

Taekook Ao3 Recommendation, Fishing Tournaments In Galveston, Articles R